题目
题解
线段树简单模板题
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
using namespace std;
int tre[200000];
void build(int root,int l,int r)
{
if(l==r)
{
scanf("%d",&tre[root]);
return;
}
int mid=(l+r)/2;
build(root*2,l,mid);
build(root*2+1,mid+1,r);
tre[root]=tre[root*2]+tre[root*2+1];
}
void update(int root,int l,int r,int x,int y)
{
if(l==r)
{
tre[root]+=y;
return;
}
int mid=(l+r)/2;
if(x<=mid)
{
update(root*2,l,mid,x,y);
}
else
{
update(root*2+1,mid+1,r,x,y);
}
tre[root]+=y;
}
int wen(int root,int l,int r,int x,int y)
{
int mid=(l+r)/2;
if(x<=l&&y>=r)
{
return tre[root];
}
int ans=0;
if(x<=mid)
{
ans+=wen(root*2,l,mid,x,y);
}
if(y>=mid+1)
{
ans+=wen(root*2+1,mid+1,r,x,y);
}
return ans;
}
int main()
{
int i,j,n,m;
string t;
int x,y;
cin>>n;
for(j=1;j<=n;j++)
{
cin>>m;
build(1,1,m);
cout<<"Case "<<j<<":"<<endl;
do
{
cin>>t;
if(t=="End") break;
cin>>x>>y;
if(t=="Add") update(1,1,m,x,y);
if(t=="Query") cout<<wen(1,1,m,x,y)<<endl;
if(t=="Sub") update(1,1,m,x,-y);
}
while(t!="End");
}
}