记录编号 227720 评测结果 AAAAAAAAAA
题目名称 magictree 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.881 s
提交时间 2016-02-18 20:19:40 内存使用 110.12 MiB
显示代码纯文本
#include<cstdio>
#define lch(x) x<<1
#define rch(x) x<<1|1
long long sum[8000005],lazy[8000005];
void build(int rt,int l,int r){
	if(l==r)scanf("%lld",sum+rt);
	else{
		int mid=(l+r)>>1;
		build(lch(rt),l,mid);
		build(rch(rt),mid+1,r);
		sum[rt]=sum[lch(rt)]+sum[rch(rt)];
	}
}
void update(int rt,int l,int r){
	lazy[lch(rt)]+=lazy[rt];lazy[rch(rt)]+=lazy[rt];
	int mid=(l+r)>>1;
	sum[lch(rt)]+=(mid-l+1)*lazy[rt];
	sum[rch(rt)]+=(r-mid)*lazy[rt];
	lazy[rt]=0;
}
long long query(int rt,int l,int r,int a,int b){
	if(a<=l&&r<=b)return sum[rt];
	if(lazy[rt])update(rt,l,r);
	int mid=(l+r)>>1;
	if(b<=mid)return query(lch(rt),l,mid,a,b);
	if(a>mid)return query(rch(rt),mid+1,r,a,b);
	return query(lch(rt),l,mid,a,b)+query(rch(rt),mid+1,r,a,b);
}
void insert(int rt,int l,int r,int a,int b,long long w){
	if(a<=l&&r<=b){
		sum[rt]+=(r-l+1)*w;
		lazy[rt]+=w;
	}else{
		update(rt,l,r);
		int mid=(l+r)>>1;
		if(b<=mid)insert(lch(rt),l,mid,a,b,w);
		else if(a>mid)insert(rch(rt),mid+1,r,a,b,w);
		else{
			insert(lch(rt),l,mid,a,b,w);
			insert(rch(rt),mid+1,r,a,b,w);
		}
		sum[rt]=sum[lch(rt)]+sum[rch(rt)];
	}
}
int main(){
	freopen("magictree.in","r",stdin);
	freopen("magictree.out","w",stdout);
	int n,m;scanf("%d%d",&n,&m);
	build(1,1,n);
	char buf[5];
	long long a,b,c;
	while(m--){
		scanf("%s",buf);
		if(buf[0]=='Q'){
			scanf("%lld%lld",&a,&b);
			printf("%lld",query(1,1,n,a+1,b+1));
		}else{
			scanf("%lld%lld%lld",&a,&b,&c);
			insert(1,1,n,a+1,b+1,c);
		}
	}
	fclose(stdin);fclose(stdout);
	return 0;
}