记录编号 395144 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 新史「新幻想史 -现代史-」 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 2.346 s
提交时间 2017-04-15 09:54:02 内存使用 2.69 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50010;
struct A{int t,u,v,w,l,r,d;}a[maxn],b[maxn];
void CDQ(int,int);
void modify(int,int,int);
long long query(int,int);
void add(int,long long,long long*);
long long query(int,long long*);
long long seq[maxn],c[2][maxn],ans[maxn];
char op;
int n,m;
int main(){
	freopen("cdcq_a.in","r",stdin);
	freopen("cdcq_a.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&seq[i]);
		seq[i]+=seq[i-1];
	}
	for(int i=1;i<=m;i++){
		scanf(" %c%d%d",&op,&a[i].l,&a[i].r);
		if(op=='Q'){
			scanf("%d",&a[i].t);
			ans[i]=seq[a[i].r]-seq[a[i].l-1];
			a[i].d=i;
		}
		else{
			a[i].u=a[i].l;
			a[i].v=a[i].r;
			scanf("%d%d%d%d%d",&a[i].w,&a[i].l,&a[i].r,&a[i].d,&a[i].t);
			ans[i]=1ull<<63;
		}
	}
	CDQ(1,m);
	for(int i=1;i<=m;i++)if(ans[i]!=(1ull<<63))printf("%lld\n",ans[i]);
	return 0;
}
void CDQ(int l,int r){
	if(l==r)return;
	int mid=(l+r)>>1;
	CDQ(l,mid);
	CDQ(mid+1,r);
	int i=l,j=mid+1,k=l;
	while(i<=mid&&j<=r){
		if(a[i].t<a[j].t||(a[i].t==a[j].t&&a[i].v)){
			if(a[i].v){//printf("WTF?!!");
				modify(a[i].u,a[i].v,-a[i].w);
				modify(a[i].l,a[i].r,a[i].d);
			}
			b[k++]=a[i++];
		}
		else{
			if(!a[j].v)ans[a[j].d]+=query(a[j].l,a[j].r);
			b[k++]=a[j++];
		}
	}
	while(i<=mid){
		if(a[i].v){
			modify(a[i].u,a[i].v,-a[i].w);
			modify(a[i].l,a[i].r,a[i].d);
		}
		b[k++]=a[i++];
	}
	while(j<=r){
		if(!a[j].v)ans[a[j].d]+=query(a[j].l,a[j].r);
		b[k++]=a[j++];
	}
	for(i=l;i<=mid;i++)if(a[i].v){
		modify(a[i].u,a[i].v,a[i].w);
		modify(a[i].l,a[i].r,-a[i].d);
	}
	copy(b+l,b+r+1,a+l);
}
void modify(int l,int r,int d){
	add(l,(long long)(1-l)*d,c[0]);
	add(r+1,(long long)r*d,c[0]);
	add(l,d,c[1]);
	add(r+1,-d,c[1]);
}
long long query(int l,int r){
	return (query(r,c[0])+query(r,c[1])*r)-(query(l-1,c[0])+query(l-1,c[1])*(l-1));
}
void add(int x,long long d,long long *c){
	while(x<=n){
		c[x]+=d;
		x+=x&-x;
	}
}
long long query(int x,long long *c){
	long long ans=0;
	while(x){
		ans+=c[x];
		x&=x-1;
	}
	return ans;
}