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