NYOJ116 士兵杀敌(二) 单点更新+区间求和

来源:互联网 发布:风尚购物网络电视直播 编辑:程序博客网 时间:2024/05/17 07:46
#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;}

阅读全文
0 0
原创粉丝点击