HDU1166敌兵布阵 简单线段树

来源:互联网 发布:手机怎么开淘宝网店 编辑:程序博客网 时间:2024/06/05 15:39

裸的线段树,单点更新,每次区段询问即可。

#include<iostream>#include<cstdio>#include<cstring>#include<ctime>#include<algorithm>#include<cstdlib>#include<cmath>#include<set>#include<bitset>#include<map>#include<stack>#include<queue>#include<vector>#include<utility>#define INF 0x3f3f3f3f#define inf 2*0x3f3f3f3f#define llinf 1000000000000000000#define pi acos(-1)#define mod 1000000007#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;typedef long long ll;typedef pair<int,int>P;int sum[50005*4],t,n,a,b;string s;void pushup(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){    if(l==r)    {        scanf("%d",&sum[rt]);        return ;    }    int m=(l+r)>>1;    build(lson);build(rson);    pushup(rt);}int query(int L,int R,int l,int r,int rt){    if(L<=l&&R>=r)    {        return sum[rt];    }    int res=0;    int m=(r+l)>>1;    if(L<=m)res+=query(L,R,lson);    if(R>m)res+=query(L,R,rson);    return res;}void add(int a,int b,int l,int r,int rt){    if(l==r)    {        sum[rt]+=b;        return ;    }    int m=(l+r)>>1;    if(a<=m)add(a,b,lson);    else add(a,b,rson);    pushup(rt);}int main(){    cin>>t;    for(int i=1;i<=t;i++)    {        cin>>n;        build(1,n,1);        cout<<"Case "<<i<<":"<<endl;        while(cin>>s)        {            if(s=="End")break;            scanf("%d%d",&a,&b);            if(s=="Query")cout<<query(a,b,1,n,1)<<endl;            else if(s=="Add")add(a,b,1,n,1);            else add(a,-b,1,n,1);        }    }    return 0;}


0 0
原创粉丝点击