记录编号 55757 评测结果 AAAAAAAAAAAAAAA
题目名称 数列操作A 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 6.019 s
提交时间 2013-03-21 20:52:52 内存使用 4.51 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iomanip>
using namespace std;
class SEGMENT{
public:
	int l,r;
	int lchild,rchild;
	int s;
};
int n;
SEGMENT tree[200001];
int d[100001]={0};//每个点的值
int tot=0;
void build(int root,int left,int right){
	tree[root].l=left,tree[root].r=right;
	if(left<right){//继续往下分
		int mid=(left+right)/2;
		tree[root].lchild=++tot;
		build(tot,left,mid);
		tree[root].rchild=++tot;
		build(tot,mid+1,right);
		tree[root].s=tree[tree[root].lchild].s+tree[tree[root].rchild].s;
	}
	else{
		tree[root].s=d[left];
		tree[root].lchild=tree[root].rchild=-1;
	}
}
void add(int root,int x,int s){//在root里把x这个节点加上s
	if(root==-1||tree[root].l>x||tree[root].r<x) return;//不包含是要闹哪样
	tree[root].s+=s;
	add(tree[root].lchild,x,s);
	add(tree[root].rchild,x,s);
}
int getsum(int root,int x,int y){//在root这个节点里面查找[x,y]的区间和
	if(root==-1||tree[root].l>y||tree[root].r<x) return 0;//不包含是要闹哪样
	if(x<=tree[root].l&&y>=tree[root].r) return tree[root].s;//包含,直接输出
	else return getsum(tree[root].lchild,x,y)+getsum(tree[root].rchild,x,y);//两边查
}
int main(){
	freopen("shulie.in","r",stdin);
	freopen("shulie.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&d[i]);
	build(tot,1,n);
	cout<<endl;
	int m;
	scanf("%d",&m);
	string s;
	int k,x,lnow,rnow;
	for(int i=0;i<m;i++){
		cin>>s;
		if(s=="ADD"){
			scanf("%d%d",&k,&x);//d[k]+=x;
			d[k]+=x;
			add(0,k,x);
		}
		else{
			scanf("%d%d",&lnow,&rnow);//区间和[s,t]
			printf("%d\n",getsum(0,lnow,rnow));
		}
	}
	return 0;
}