Potentiometers

点击打开链接

题意:输入一个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");
    }
}


猜你喜欢

转载自blog.csdn.net/qq_37891604/article/details/80699955