比赛 |
cdcqの省选膜你赛 |
评测结果 |
AWWWWWAAWWWWWWAAWWWW |
题目名称 |
新史「新幻想史 -现代史-」 |
最终得分 |
25 |
用户昵称 |
Marvolo |
运行时间 |
0.673 s |
代码语言 |
C++ |
内存使用 |
9.09 MiB |
提交时间 |
2017-04-11 21:52:57 |
显示代码纯文本
#pragma GCC optimize(3)
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 50010
using namespace std;
int i,n,m;
char c;
int d[N],q[N],v[N],ans[N];
struct Marvolo{
int sign,x,y,z,t,l,r,v,id;
}a[N],b[N];
struct Tree{
int l,r,d,p;
}t[6*N];
inline void Maketree(int x,int low,int high){
int mid=(low+high)>>1;
t[x].l=low; t[x].r=high;
if (low==high) {t[x].d=d[low]; return;}
Maketree(x*2,low,mid); Maketree(x*2+1,mid+1,high);
t[x].d+=t[x*2].d+t[x*2+1].d;
}
inline void Clear(int X){
int l=X*2,r=X*2+1;
t[l].d+=t[X].p*(t[l].r-t[l].l+1); t[r].d+=t[X].p*(t[r].r-t[r].l+1);
t[l].p+=t[X].p; t[r].p+=t[X].p;
t[X].p=0;
}
inline void Add(int x,int low,int high,int val){
int mid=(t[x].l+t[x].r)>>1;
if (t[x].l==t[x].r) {t[x].d+=val; return;}
if (t[x].l==low&&t[x].r==high){
t[x].d+=val*(t[x].r-t[x].l+1); t[x].p+=val; return;}
if (t[x].p) Clear(x);
if (high<=mid) Add(x*2,low,high,val); else
if (low>mid) Add(x*2+1,low,high,val); else{
Add(x*2,low,mid,val); Add(x*2+1,mid+1,high,val);
}
t[x].d=t[x*2].d+t[x*2+1].d;
}
inline int Query(int x,int low,int high){
int mid=(t[x].l+t[x].r)>>1;
if (t[x].l==t[x].r) return t[x].d;
if (t[x].p) Clear(x);
if (low==t[x].l&&high==t[x].r) return t[x].d;
if (high<=mid) return Query(x<<1,low,high); else
if (low>mid) return Query((x<<1)+1,low,high); else
return Query(x<<1,low,mid)+Query((x<<1)+1,mid+1,high);
}
inline bool Cmp(const Marvolo x,const Marvolo y){
if (x.sign==y.sign) return x.t<y.t;
if (x.sign==1&&y.sign==2){
if (x.id<y.id) if (x.t>y.t) return 0; else return 1;
if (x.id>y.id) return 0;
} else {
if (x.id<y.id) return 1;
if (x.id>y.id) if (x.t<y.t) return 1; else return 0;
}
}
int main(){
freopen("cdcq_a.in","r",stdin);
freopen("cdcq_a.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%d",&d[i]);
for (i=1;i<=m;i++){
c=getchar();
while (c!='Q'&&c!='M') c=getchar();
if (c=='Q') {
a[i].sign=2; scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].t);
} else {
a[i].sign=1;
scanf("%d%d%d%d%d%d%d",&a[i].x,&a[i].y,&a[i].z,&a[i].l,&a[i].r,&a[i].v,&a[i].t);
}
a[i].id=i;
}
Maketree(1,1,n); sort(a+1,a+1+m,Cmp);
for (i=1;i<=m;i++){
if (a[i].sign==2) ans[a[i].id]=Query(1,a[i].x,a[i].y),v[a[i].id]=1;
else {
Add(1,a[i].x,a[i].y,-a[i].z); Add(1,a[i].l,a[i].r,a[i].v);
}
}
for (i=1;i<=n;i++) if (v[i]) printf("%d\n",ans[i]);
return 0;
}