NYOJ116 士兵殺敵(二) 單點更新+區間求和
阿新 • • 發佈:2018-12-19
#include<bits/stdc++.h> using namespace std; const int MAXNODE=4000000+100; const int MAXN=2e6+10; struct NODE{ //int value; //value表示單點值 int grade; //grade表示掌控區間的最大值 int left,right; }node[MAXNODE]; int father[MAXN]; void BuildTree(int i,int left,int right){ node[i].left=left; node[i].right=right; node[i].grade=0; if(left==right){ father[left]=i; return; } BuildTree(i<<1,left,(int)(floor(left+right)/2.0)); BuildTree((i<<1)+1,(int)(floor(left+right)/2.0)+1,right); } void UpdateTree(int ri,int b){ if(ri==1){ node[ri].grade+=b; return ; } node[ri].grade+=b; UpdateTree(ri/2,b); } int Sum; void Query(int i,int l,int r){ if(node[i].left==l&&node[i].right==r){ Sum+=node[i].grade; return ; } i=i<<1; if(l<=node[i].right){ if(r<=node[i].right) Query(i,l,r); else Query(i,l,node[i].right); } i++; if(r>=node[i].left){ if(l>=node[i].left) Query(i,l,r); else Query(i,node[i].left,r); } } int main(){ int n,m,g; ios::sync_with_stdio(false); while(cin>>n>>m){ BuildTree(1,1,n); for(int i=1;i<=n;i++){ cin>>g; //node[father[i]].value=g; UpdateTree(father[i],g); } char op[10]; int a,b; while(m--){ cin>>op>>a>>b; if(op[0] == 'Q'){ Sum=0; Query(1,a,b); cout<<Sum<<endl; } else{ //node[father[a]].value+=b; UpdateTree(father[a],b); } } } return 0; }