比赛 cdcqの省选膜你赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 新史「新幻想史 -现代史-」 最终得分 100
用户昵称 will 运行时间 1.400 s
代码语言 C++ 内存使用 28.52 MiB
提交时间 2017-04-11 10:41:54
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
#define TR(x) cout<<#x<<'='<<x<<endl
using namespace std;
typedef long long ll;

const int MAXN=200005, MAXB=2e7, INF=0x3f3f3f3f;

char BUF[MAXB], *cp=BUF;

void rd(int &x){
	x=0;
	while(*cp<'0'||'9'<*cp) cp++;
	while('0'<=*cp&&*cp<='9') x=x*10+*cp-'0', cp++;
}

char rdc(){
	while(*cp<'A'||'Z'<*cp) cp++;
	return *cp;
}

int N, M, T, K;
int vis[MAXN];
ll ans[MAXN];

struct BIT{
	ll s[MAXN], t[MAXN];
	inline void _add(int x, int k){
		ll m=k*x;
		for(int i=x; i<=N; i+=i&-i) s[i]+=k;
		for(int i=x; i<=N; i+=i&-i) t[i]+=m;
	}
	void add(int l, int r, int k){
		_add(l,k); _add(r+1,-k);
	}
	inline ll _sum(int x){
		ll r=0;
		for(int i=x; i; i-=i&-i) r+=s[i];
		r=r*(x+1);
		for(int i=x; i; i-=i&-i) r-=t[i];
		return r;
	}
	ll sum(int l, int r){
		return _sum(r)-_sum(l-1);
	}
	void clr(){
		memset(s,0,sizeof(s));
		memset(t,0,sizeof(t));
	}
}B;

struct Qry{
	int l,r,v,t,id;
	Qry(){}
	Qry(int l,int r,int v,int t,int id):l(l),r(r),v(v),t(t),id(id){}
	int operator<(const Qry &o)const{
		if(t==o.t) return id<o.id;
		return t<o.t;
	}
}Q[MAXN];

void cdq(int l, int r){
//	TR(l),TR(r);
	if(l==r) return;
	int mid=(l+r)>>1;
	cdq(l,mid);
	cdq(mid+1,r);
	sort(Q+l,Q+r+1);
	for(int i=l; i<=r; ++i){
	//	printf("%d: l=%d, r=%d, v=%d, id=%d\n", i,Q[i].l,Q[i].r,Q[i].v,Q[i].id);
		if(Q[i].id<=mid&&!vis[Q[i].id]){
			B.add(Q[i].l,Q[i].r,Q[i].v);
		}else if(Q[i].id>mid&&vis[Q[i].id]){
			ans[Q[i].id]+=B.sum(Q[i].l,Q[i].r);
		}
	}
	for(int i=l; i<=r; ++i){
		if(Q[i].id<=mid&&!vis[Q[i].id]){
			B.add(Q[i].l,Q[i].r,-Q[i].v);
		}
	}
//	for(int i=1; i<=T; ++i) TR(ans[i]);
}

int main(){
	FILE *_file=fopen("cdcq_a.in", "r");
	BUF[fread(BUF, 1, MAXB, _file)]=0;
	freopen("cdcq_a.out", "w", stdout);
	rd(N),rd(M);
	for(int i=1,a; i<=N; ++i) rd(a),B.add(i,i,a);
	for(int i=1,x,y,z,l,r,v,t; i<=M; ++i){
		if(rdc()=='Q'){
			rd(x),rd(y),rd(z);
			++T,Q[T]=Qry(x,y,0,z,T);
			vis[T]=1; ans[T]=B.sum(x,y);
		}else{
			rd(x),rd(y),rd(z),rd(l),rd(r),rd(v),rd(t);
			++T,Q[T]=Qry(x,y,-z,t,T);
			++T,Q[T]=Qry(l,r,v,t,T);
		}
	}
	B.clr();
	cdq(1,T);
	for(int i=1; i<=T; ++i){
		if(vis[i]) printf("%lld\n", ans[i]);
	}
	return 0;
}