描述

给一个长为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. Object C学习笔记3-对象的使用和定义

    1. 如何定义一个对象 在面向对象的语言中,定义一个对象是使用Class关键字,而在Object-C中则是使用@interface,@interface用于定义对象的属性和方法,@implementa ...

  2. 学员管理系统(SQLAlchemy 实现)

    一.业务逻辑 二.设计表结构 三.代码结构 start.py import os, sys sys.path.insert(0, os.path.dirname(os.path.dirname(os. ...

  3. url的param与dict转换

    urllib.parse.urlencode urlencode from urllib import parse from urllib.request import urlopen from ur ...

  4. 互评Alpha作品——Hello World!团队作品空天猎

    基于NABCD评论作品 1.Need需求:市面上同类型的手机及PC端飞行射击类游戏有很多,所以从需求方面来说,这款游戏的潜在客户非常有局限性.近些年较火的飞行射击类游戏,例如腾讯14年发行的<全 ...

  5. 10.29 scrum meeting newbe软件团队工作分配

    这次会议,我们主要讨论了目前阶段的主要任务与任务分配问题. 首先,通读代码,理解程序的运行方式是必不可少的环节.所以我们要求团队的所有成员通读代码.并且对于开发人员和测试人员,要求写出我们分配的各自模 ...

  6. 20135234mqy-——信息安全系统设计基础第三周学习总结

    (1)计算机将信息按位编码,通常组成字节序列.用不同的编码方式表示整数,师叔和字符串.不同的计算机模型在编码数字和多字节数据中的字节排序时使用不同的约定. (2)C语言的设计可以包容多种不同字长和数字 ...

  7. 20172325 2017-2018-2 《Java程序设计》第五周学习总结

    20172325 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 1.布尔表达式的值只有真或假,表达式的结果决定了下一步将要执行的语句. 2.循环语句可以用在 ...

  8. spring冲刺第二天

    昨天查找了安卓开发的相关资料以及炸弹人游戏的资料. 由于今天课程比较多,只在晚上将安卓开发环境配置完成. 在安装软件时环境配置出现了问题,不过问过同学后成功解决.

  9. Chapter 8 面向对象设计

    设计也是一个建模的活动,在设计阶段将集中研究系统的软件实现问题包括体系结构设计.详细设计.用户界面设计和数据库设计等.通常设计活动分为系统设计和详细设计两个主要阶段.软件设计要遵循模块化.耦合度和内聚 ...

  10. 作业1.3——Android平台的开发环境的发展演变

    一开始的打算是在eclipse的基础上搭建Android平台,在ADT.SDK上兜兜转转,听过一些前车之鉴后,还是选择了Android studio.因为之前安装过eclipse,就省去了JDK下载和 ...