题意:输入一个n,然后输入n个数,接着输入一行,s,x,y,若s==END停止输入,若s==“M”查询[x,y]的和
若s=="S",将x的值修改为y
案例之间输出一个空行
思路:线段树裸题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=200000;
int a[maxn];
struct Tree
{
int left,right,sum;
};
Tree tree[maxn<<2];
void build(int id,int l,int r)
{
tree[id].left=l;
tree[id].right=r;
if(l==r)
tree[id].sum=a[l];
else
{
int mid=(l+r)>>1;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
}
void update(int id,int pos,int val)
{
if(tree[id].left==tree[id].right)
tree[id].sum=val;
else
{
int mid=(tree[id].left+tree[id].right)>>1;
if(pos<=mid)
update(id*2,pos,val);
else
update(id*2+1,pos,val);
tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
}
int query(int id,int l,int r)
{
if(tree[id].left==l&&tree[id].right==r)
return tree[id].sum;
else
{
int mid=(tree[id].left+tree[id].right)>>1;
if(r<=mid)
query(id*2,l,r);
else if(l>mid)
query(id*2+1,l,r);
else
return query(id*2,l,mid)+query(id*2+1,mid+1,r);
}
}
int main()
{
int n,i,ca,ans;
string s;
int x,y;
ca=0;
while(scanf("%d",&n))
{
if(n==0)
break;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
if(ca)
printf("\n");
printf("Case %d:\n",++ca);
while(cin>>s)
{
if(s=="END")
break;
else
{
scanf("%d%d",&x,&y);
if(s=="M")
{
ans=query(1,x,y);
printf("%d\n",ans);
}
else
update(1,x,y);
}
}
//printf("\n");
}
}