hdu1166 敌兵布阵 线段树

xiaoxiao2021-02-28  26

#include <iostream> using namespace std; int t,n,as[50005],cas=1,first,last,num,sum[50005<<2]; void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void buildtree(int l ,int r,int rt) { if(l==r) { sum[rt]=as[l]; return; } int m=(l+r)>>1; buildtree(l,m,rt<<1); buildtree(m+1,r,rt<<1|1); pushup(rt); } void add(int k,int num,int l,int r,int rt) { if(l==r) {sum[rt]+=num; return; } int m=(l+r)>>1; if(k<=m) add(k,num,l,m,rt<<1); else add(k,num,m+1,r,rt<<1|1); pushup(rt); } void sub(int k,int num,int l,int r,int rt) { if(l==r) {sum[rt]-=num; return; } int m=(l+r)>>1; if(k<=m) sub(k,num,l,m,rt<<1); else sub(k,num,m+1,r,rt<<1|1); pushup(rt); } int ans(int a,int b,int rt,int l,int r) { if(a<=l&&r<=b) { return sum[rt]; } int m=(l+r)>>1; int all=0; if(a<=m) all+=ans(a,b,rt<<1,l,m); if(b>m) all+=ans(a,b,rt<<1|1,m+1,r); return all; } int main() { string s; cin>>t; while(t--) { cout<<"Case "<<cas<<":"<<endl; cas++; cin>>n; for(int i=1;i<=n;i++) { cin>>as[i]; } buildtree(1,n,1); while(cin>>s) { if(s=="End") break; if(s=="Query") { cin>>first>>last; cout<<ans(first,last,1,1,n)<<endl; } else if(s=="Add") { cin>>first>>num; add(first,num,1,n,1); } else if(s=="Sub") { cin>>first>>num; sub(first,num,1,n,1); } } } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2623704.html

最新回复(0)