比赛 数列操作练习题 评测结果 AAAAAAAAAAAAAAA
题目名称 数列操作A 最终得分 100
用户昵称 HZOI_蒟蒻一只 运行时间 2.092 s
代码语言 C++ 内存使用 18.50 MiB
提交时间 2017-03-19 06:12:52
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct segmentree{
	long long left,right,mid,sum;}p[1000005];
void build(int a,int b,int num)
{
	p[num].left=a,p[num].right=b,p[num].mid=(a+b)/2,p[num].sum=0;
	if(a+1==b)return;
	build(a,p[num].mid,2*num);build(p[num].mid,b,2*num+1);
}
void add(int pos,int num,int n)
{
	p[n].sum+=num;
	if(p[n].left+1==p[n].right)return;
	if(pos<p[n].mid)add(pos,num,2*n);
	else add(pos,num,2*n+1);
}
int query(int a,int b,int n)
{
	if(p[n].left==a&&p[n].right==b)return p[n].sum;
	if(p[n].left+1==p[n].right)return p[n].sum;
	if(a<p[n].mid)
		if(b<=p[n].mid)return query(a,b,2*n);
		else return query(a,p[n].mid,2*n)+query(p[n].mid,b,2*n+1);
	else return query(a,b,2*n+1);
}
char a[8];int n,m,x,i,j;
int haha()
{
	freopen("shulie.in","r",stdin);
	freopen("shulie.out","w",stdout);
	scanf("%d",&n);build(1,n+1,1);
	for(int k=1;k<=n;k++){scanf("%d",&x);add(k,x,1);}
	scanf("%d",&m);
	for(int k=1;k<=m;k++){scanf("%s",a);scanf("%d%d",&i,&j);
		if(a[0]=='A')add(i,j,1);
		else cout<<query(i,j+1,1)<<endl;}
	//while(1);
}
int sb=haha();
int main(){;}