描述

给一个长为N的数列,有M次操作,每次操作时以下三种之一:

(1)修改数列中的一个数

(2)求数列中某连续一段所有数的两两乘积的和 mod 1000000007

(3)求数列中某连续一段所有相邻两数乘积的和 mod 1000000007

输入

第一行两个正整数N和M。

第二行N的整数表示这个数列。

接下来M行,每行开头是一个字符,若该字符为'M',则表示一个修改操作,接下来两个整数x和y,表示把x位置的值修改为y;若该字符为'Q',则表示一个询问操作,接下来两个整数x和y,表示对[x,y]区间做2号询问;若该字符为'A',则表示一个询问操作,接下来两个整数x和y,表示对[x,y]区间做3号询问。

输出

对每一个询问操作单独输出一行,表示答案。

样例输入

5 5

1 2 3 4 5

Q 1 5

A 1 5

M 2 7

Q 1 5

A 1 5

样例输出

85

40

150

60

提示

1<=N<=105,1<=M<=105,输入保证合法,且所有整数可用带符号32位整型存储。

操作2:每个节点存储区间内所有数字两两乘积之和以及区间内所有数字的加和即可

注意输入的数字可以有负数,也可以大于mod-_-

#include<cstdio>
const int mod=1000000007;
const int maxn=100005;
int a[maxn],n,m;
int sum1[maxn<<2],sum2[maxn<<2],sum3[maxn<<2];
void build(int rt,int l,int r){
if(l==r){
sum1[rt]=a[l];sum2[rt]=0;sum3[rt]=a[l]*1ll*a[l+1]%mod;
}else{
int mid=(l+r)>>1;
build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
sum1[rt]=(sum1[rt<<1]+sum1[rt<<1|1])%mod;
sum2[rt]=(sum2[rt<<1]+sum2[rt<<1|1])%mod;
sum2[rt]=(sum2[rt]+sum1[rt<<1]*1ll*sum1[rt<<1|1])%mod;
sum3[rt]=(sum3[rt<<1]+sum3[rt<<1|1])%mod;
}
}
void Insert12(int rt,int l,int r,int x,int y){
if(l==r){
sum1[rt]=y;sum2[rt]=0;
}else{
int mid=(l+r)>>1;
if(x<=mid)Insert12(rt<<1,l,mid,x,y);
else Insert12(rt<<1|1,mid+1,r,x,y);
sum1[rt]=(sum1[rt<<1]+sum1[rt<<1|1])%mod;
sum2[rt]=(sum2[rt<<1]+sum2[rt<<1|1])%mod;
sum2[rt]=(sum2[rt]+sum1[rt<<1]*1ll*sum1[rt<<1|1])%mod;
}
}
void Insert3(int rt,int l,int r,int x,int y){
if(l==r){
sum3[rt]=y;
}else{
int mid=(l+r)>>1;
if(x<=mid)Insert3(rt<<1,l,mid,x,y);
else Insert3(rt<<1|1,mid+1,r,x,y);
sum3[rt]=(sum3[rt<<1]+sum3[rt<<1|1])%mod;
}
}
int q3(int rt,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr){
return sum3[rt];
}else{
int mid=(l+r)>>1;
if(qr<=mid)return q3(rt<<1,l,mid,ql,qr);
if(ql>mid)return q3(rt<<1|1,mid+1,r,ql,qr);
return (q3(rt<<1,l,mid,ql,qr)+q3(rt<<1|1,mid+1,r,ql,qr))%mod;
}
}
int s1[maxn],s2[maxn],cnt;
void Q2(int rt,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr){
++cnt;s1[cnt]=sum1[rt];s2[cnt]=sum2[rt];
}else{
int mid=(l+r)>>1;
if(ql<=mid)Q2(rt<<1,l,mid,ql,qr);
if(qr>mid)Q2(rt<<1|1,mid+1,r,ql,qr);
}
}
int q2(int rt,int l,int r,int ql,int qr){
cnt=0;
Q2(rt,l,r,ql,qr);
int S1=0,S2=0;
for(int i=1;i<=cnt;++i){
S2=(S2+s2[i])%mod;
S2=(S2+S1*1ll*s1[i])%mod;
S1=(S1+s1[i])%mod;
}
return S2;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%d",a+i);
for(int i=1;i<=n;++i)a[i]=(a[i]%mod+mod)%mod;
build(1,1,n);
char buf[10];int x,y;
while(m--){
scanf("%s%d%d",buf,&x,&y);
if(buf[0]=='M'){
y=(y%mod+mod)%mod;
a[x]=y;
Insert12(1,1,n,x,y);
if(x>=2)Insert3(1,1,n,x-1,a[x-1]*1ll*a[x]%mod);
if(x<n)Insert3(1,1,n,x,a[x]*1ll*a[x+1]%mod);
}else if(buf[0]=='A'){
if(x==y)printf("0\n");
else printf("%d\n",q3(1,1,n,x,y-1));
}else{
if(x==y)printf("0\n");
else printf("%d\n",q2(1,1,n,x,y));
}
} return 0;
}

[cdqzds] Challenge4的更多相关文章

  1. [PyData] 01 - Web Crawler

    前言 一.总体策略 一些常见抓取数据的例子.三步走: 抓取数据并存储 <---- 数据处理 数据展示 二.学习资源 首先,通过Beautiful Soup抓取数据 from http://www ...

  2. The FLARE On Challenge

    上周才开始做这个CTF,用一周左右的时间完成了全部7道题.算是为即将到来的找工作进行热身和学习,下面记录一下遇到的问题和学到的东西,具体的解题过程就不详细描述了. challenge1 这道题用IDA ...

  3. [Kaggle] Online Notebooks

    前言 Let's go to https://www.kaggle.com/ Kaggle Notebook 有实践记录的案例. 一.线性拟合噪声数据 [Sklearn] Linear regress ...

  4. PHP_Code_Challenge 1~30

    1. 1wMDEyY2U2YTY0M2NgMTEyZDQyMjAzNWczYjZgMWI4NTt3YWxmY= <?php error_reporting(0); require __DIR__ ...

随机推荐

  1. Windows:任务调度器

    Windows 服务器系列: Windows:查看IP地址,IP地址对应的机器名,占用的端口,以及占用该端口的应用程 Windows:使用Dos命令管理服务(Services) Windows:任务调 ...

  2. 【PaPaPa】实现缓存决策 - 让你的缓存变的有智慧

    我有话说 本来这一篇我打算放到后面再说,可是之前泄漏了一点关于缓存决策的代码后被好多人催更了. 在此感谢大家的支持,让我更有动力的写这个系列.你们的关注让我觉得我的决定是对的,我会坚持下去把这个项目做 ...

  3. Java类型转换工具类(十六进制—bytes互转、十进制—十六进制互转,String—Double互转)

    /** * 数据类型转换工具类 * @author cyf * */ public class NumConvertUtil{ /** * bytes 转16进制字符串 * @param bArray ...

  4. Python的with语句(文件打开方式)

    Python文件打开方式(with语句) python编程中对于文件的打开方式主要有以下两种: 1.利用直接性的open("","")函数:(举例说明) try ...

  5. double类型四舍五入保留两位小数

    double x; int(x * 100 + 0.5) /100; 通过int强制转换截去后面的位数,实现两位小数保存, 由于强制转换直接把后面的信息截去,所以要想五入需要加0.5.

  6. opengl坐标系统

    概述 为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model).观察(View).投影(Projection)三个矩阵.我们的顶点坐标起始于局部空间(L ...

  7. [Unity Shader] 逐顶点光照和逐片元漫反射光照

    书中的6.4节讲的是漫反射的逐顶点光照和逐片元光照. 前一种算法是根据漫反射公式计算顶点颜色(顶点着色器),对颜色插值(光栅化过程)返回每个像素的颜色值(片元着色器). 第二种算法是获得顶点的法线(顶 ...

  8. 曲线救国:安装golang.org/x/*

    很多第三方库都用到了golang.org/x下面的包,但是国内不通过VPN是无法访问到的,不过没关系,在github.com/golang下面,基本都有对应的包 如何操作? 以安装sys包为例 git ...

  9. HTML6的10个高级新特性

    网络技术正趋向于发展为一个巨大的移动APP市场,在Web开发的革命浪潮中起着指示性作用,自HTML引入以来,应用程序变得So easy,web开发中运用先进技术也很容易处理各种复杂Bug. 作为专业的 ...

  10. 我看微软收购GitHub

    今天是微软收购GitHub的第三天,之前很多人担心被微软收购的GitHub会步Skype,诺基亚等企业的后尘,凡此种种我觉得更多人的担心是:GitHub不再开源免费罢了. GitHub今年4月刚成立十 ...