比赛 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;
}