描述

给一个长为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. TortoiseGit版本库中某个文件显示问号或叹号的问题解决办法

    这是一个怪问题,原因就是文件名大小写与版本库管理的大小写不一致. 解决办法: 1.先把文件夹中的物理文件名改为版本库浏览器中显示的文件名(版本库浏览器中的文件名不知道怎么改),改了以后这个文件图标就变 ...

  2. centos下安装docker,kubelet kubeadm kubectl

    目录 安装docker 安装命令 安装 kubelet kubeadm kubectl 安装命令 安装docker 安装命令 yum install docker -y 启动 systemctl en ...

  3. [PLC]ST语言二:LDP_LDF_ANDP_ANDF_ORP_ORF

    一:LDP_LDF_ANDP_ANDF_ORP_ORF基本指令 说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言: (*LDP(EN,s)/ORP(EN,S)*) M ...

  4. sublime text 安装json插件

    1.安装JSON插件(直接安装或在线插件安装均可) 1-1.直接安装 下载安装包https://github.com/dzhibas/SublimePrettyJson,解压缩到Packages目录( ...

  5. 记一次eslint规则配置

    { // 环境定义了预定义的全局变量. "env": { //环境定义了预定义的全局变量.更多在官网查看 "browser": true, "node ...

  6. [C++]typedef用法

    参考:C/C++ typedef用法详解(真的很详细) 四个用途 定义一种类型的别名,而不是简单的宏替换 定义struct新对象的别名 定义和平台无关的类型 为复杂声明定义一个简单的别名 typede ...

  7. linux上的mysql配置过程

    自己阿里云上的服务器,记录下mysql的配置过程防止后面忘记 1. 首先用apt-get工具安装mysql sudo apt-get install mysql-server sudo apt-get ...

  8. 学习笔记 | treap | splay

    目录 前言 treap 它的基本操作 前言 不会数据结构选手深深地感受到了来自treap的恶意QwQ 在听的时候感觉自己听得听懂的??大概只是听懂了它的意思 代码是怎么写都感觉写不好╮(╯﹏╰)╭ 菜 ...

  9. 笨办法学Python - 习题1: A Good First Program

    在windows上安装完Python环境后,开始按照<笨办法学Python>书上介绍的章节进行练习. 习题 1: 第一个程序 第一天主要是介绍了Python中输出函数print的使用方法, ...

  10. SQL中读取Excel 以及 bpc语言

    --开启导入功能 reconfigure reconfigure --允许在进程中使用ACE.OLEDB.12 --允许动态参数 EXEC master.dbo.sp_MSset_oledb_prop ...