比赛 |
cdcqの省选膜你赛 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
新史「新幻想史 -现代史-」 |
最终得分 |
100 |
用户昵称 |
再见 |
运行时间 |
4.202 s |
代码语言 |
C++ |
内存使用 |
22.42 MiB |
提交时间 |
2017-04-11 19:50:43 |
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cctype>
typedef long long int LL;
using namespace std;
inline int read(){
int x=0,f=0; char ch;
while(ch=getchar(),!isdigit(ch)) ch=='-'?f=1:false;
while(x=x*10+ch-'0',ch=getchar(),isdigit(ch));
return f?-x:x;
}
struct node{
int op,id,t,x1,y1,x2,y2,v1,v2; LL ans;
node(){}
node(int _op,int _id,int _t,int _x1,int _y1,int _x2,int _y2,int _v1,int _v2,int _ans)
:op(_op),id(_id),t(_t),x1(_x1),y1(_y1),x2(_x2),y2(_y2),v1(_v1),v2(_v2),ans(_ans){}
}Q[100010],Q1[100010];
LL val[100010],S[100010],addv[800010],sum[800010];
int n,m; char str[10];
bool cmp(const node &a,const node &b){
if(a.t==b.t) return a.id<b.id;
return a.t<b.t;
}
void pushdown(int o,int l,int r){
if(addv[o]){
int mid=(l+r)>>1,lc=o<<1,rc=o<<1|1;
addv[lc]+=addv[o];
addv[rc]+=addv[o];
sum[lc]+=addv[o]*(mid-l+1);
sum[rc]+=addv[o]*(r-mid);
addv[o]=0;
}
}
void add(int o,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr){
addv[o]+=v;
sum[o]+=1ll*v*(r-l+1);
return;
}
pushdown(o,l,r);
int mid=(l+r)>>1;
if(ql<=mid) add(o<<1,l,mid,ql,qr,v);
if(mid<qr) add(o<<1|1,mid+1,r,ql,qr,v);
sum[o]=sum[o<<1]+sum[o<<1|1];
}
LL query(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return sum[o];
pushdown(o,l,r);
int mid=(l+r)>>1; LL re=0;
if(ql<=mid) re+=query(o<<1,l,mid,ql,qr);
if(mid<qr) re+=query(o<<1|1,mid+1,r,ql,qr);
return re;
}
void update(int l,int r){
for(int i=l;i<=r;i++){
if(!Q1[i].op){
add(1,1,n,Q1[i].x1,Q1[i].y1,-Q1[i].v1);
add(1,1,n,Q1[i].x2,Q1[i].y2,Q1[i].v2);
}
else
Q1[i].ans+=query(1,1,n,Q1[i].x1,Q1[i].y1);
}
for(int i=l;i<=r;i++)
if(!Q1[i].op){
add(1,1,n,Q1[i].x1,Q1[i].y1,Q1[i].v1);
add(1,1,n,Q1[i].x2,Q1[i].y2,-Q1[i].v2);
}
}
void CDQ(int l,int r){
if(l>=r) return;
int mid=(l+r)>>1,cnt=0;
for(int i=l;i<=mid;i++) if(!Q[i].op) Q1[++cnt]=Q[i];
for(int i=mid+1;i<=r;i++) if(Q[i].op) Q1[++cnt]=Q[i];
sort(Q1+1,Q1+cnt+1,cmp);
update(1,cnt);
for(int i=1;i<=cnt;i++)
if(Q1[i].op)
Q[Q1[i].id].ans=Q1[i].ans;
CDQ(l,mid);
CDQ(mid+1,r);
}
int main(){
freopen("cdcq_a.in","r",stdin);
freopen("cdcq_a.out","w",stdout);
n=read(); m=read();
for(int i=1;i<=n;i++){
int x=read();
val[i]=x;
}
for(int i=1;i<=m;i++){
scanf("%s",str);
if(str[0]=='Q'){
int a=read(),b=read(),c=read();
Q[i]=node(1,i,c,a,b,0,0,0,0,0);
}
if(str[0]=='M'){
int a=read(),b=read(),c=read(),a1=read(),b1=read(),c1=read(),d=read();
Q[i]=node(0,i,d,a,b,a1,b1,c,c1,0);
}
}
CDQ(1,m);
for(int i=1;i<=n;i++)
S[i]=S[i-1]+val[i];
for(int i=1;i<=m;i++)
if(Q[i].op){
Q[i].ans+=S[Q[i].y1]-S[Q[i].x1-1];
printf("%lld\n",Q[i].ans);
}
return 0;
}