比赛 |
cdcqの省选膜你赛 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
新史「新幻想史 -现代史-」 |
最终得分 |
100 |
用户昵称 |
liaoy |
运行时间 |
3.337 s |
代码语言 |
C++ |
内存使用 |
10.02 MiB |
提交时间 |
2017-04-11 21:27:02 |
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
char ch; bool flr;
inline void read(int &a){
flr=1;
for(ch=getchar();ch>'9'||ch<'0';ch=getchar())if(ch=='-')flr=0;
for(a=0;ch<='9'&&ch>='0';ch=getchar())a=((a+(a<<2))<<1)+(ch^'0');
if(!flr)a=-a;
}
int n,m,qtop,top;
int val[50010];
struct opt{
int x,l,r,num;
int opt;//opt==0表示查询,opt不为0表示修改。特别的。表示修改w
}O[100010],tmp[100010];
long long Ans[50010];
struct node{
int l,r,m;
long long sum,tag;
}Seg[50010<<2];
void Segbuild(int p,int l,int r){
Seg[p].l=l; Seg[p].r=r; Seg[p].m=(l+r)>>1; if(l==r)return;
Segbuild(p<<1,l,Seg[p].m); Segbuild(p<<1|1,Seg[p].m+1,r);
}
void unite(int p){
Seg[p].sum=Seg[p<<1].sum+Seg[p<<1|1].sum+Seg[p].tag*(Seg[p].r-Seg[p].l+1);
}
void Change(int p,int l,int r,int data){
if(Seg[p].l==l&&Seg[p].r==r){
Seg[p].sum+=(long long)data*(r-l+1); Seg[p].tag+=data; return;
}
if(r<=Seg[p].m)Change(p<<1,l,r,data);
else
if(Seg[p].m+1<=l)Change(p<<1|1,l,r,data);
else
Change(p<<1,l,Seg[p].m,data),Change(p<<1|1,Seg[p].m+1,r,data);
unite(p);
}
long long Getsum(int p,int l,int r){
if(Seg[p].l==l&&Seg[p].r==r)return Seg[p].sum;
long long sum=Seg[p].tag*(r-l+1);
if(r<=Seg[p].m)sum+=Getsum(p<<1,l,r);
else
if(Seg[p].m+1<=l)sum+=Getsum(p<<1|1,l,r);
else
sum+=Getsum(p<<1,l,Seg[p].m)+Getsum(p<<1|1,Seg[p].m+1,r);
return sum;
}
void CDQ(int l,int r){
if(l==r)return;
int m=(l+r)>>1,tl,tr,tt;
CDQ(l,m); CDQ(m+1,r);
for(tl=l,tr=m+1;tr<=r;tr++){
if(O[tr].opt)continue;
while(O[tl].x<=O[tr].x&&tl<=m){
if(O[tl].opt)Change(1,O[tl].l,O[tl].r,O[tl].opt);
tl++;
}
Ans[O[tr].num]+=Getsum(1,O[tr].l,O[tr].r);
}
for(tl--;tl>=l;tl--)if(O[tl].opt)Change(1,O[tl].l,O[tl].r,-O[tl].opt);
for(tt=l,tl=l,tr=m+1;tt<=r;tt++)if((tr>r)||(tl<=m&&O[tl].x<=O[tr].x))tmp[tt]=O[tl++];else tmp[tt]=O[tr++];
for(tt=l;tt<=r;tt++)O[tt]=tmp[tt];
}
int main(){
int i,opt,x;
freopen("cdcq_a.in","r",stdin); freopen("cdcq_a.out","w",stdout);
read(n); read(m);
for(i=1;i<=n;i++)read(val[i]);
for(i=1;i<=m;i++){
for(ch=getchar();ch!='Q'&&ch!='M';ch=getchar()); opt=(ch!='Q');
if(opt){
top++;
read(O[top].l); read(O[top].r); read(O[top].opt); O[top].opt=-O[top].opt;
top++;
read(O[top].l); read(O[top].r); read(O[top].opt);
read(x);
O[top].x=O[top-1].x=x;
}else{
qtop++; top++;
read(O[top].l); read(O[top].r); read(O[top].x); O[top].num=qtop;
}
}
Segbuild(1,1,n);
CDQ(1,top);
for(i=1;i<=n;i++)Change(1,i,i,val[i]);
for(i=1;i<=top;i++)if(!O[i].opt)Ans[O[i].num]+=Getsum(1,O[i].l,O[i].r);
for(i=1;i<=qtop;i++)printf("%lld\n",Ans[i]);
}