题目来自大神博客的线段树专题
http://www.notonlysuccess.com/index.php/segment-tree-complete/
hdu1166 敌兵布阵
题意:O(-1)
思路:O(-1)
线段树功能:update:单点增减 query:区间求和
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <map> #include <utility> #include <queue> #include <stack> using namespace std; const int INF=1<<30; const double eps=1e-6; const int N = 50010; int sum[N<<2],n,M; void add(int x,int v) { for(x+=M;x;x>>=1) sum[x]+=v; } int query(int l,int r) { int res=0; for(l=l+M-1,r=r+M+1;l^r^1;l>>=1,r>>=1) { if(~l&1) res+=sum[l^1]; if(r&1) res+=sum[r^1]; } return res; } void run() { scanf("%d",&n); for(M=1;M<=n+1;M*=2); memset(sum,0,sizeof(sum)); int x,y; for(int i=1;i<=n;++i) { scanf("%d",&x); add(i,x); } char s[15]; static int cas=1; printf("Case %d:\n",cas++); while(scanf("%s",s)!=EOF && s[0]!='E') { scanf("%d%d",&x,&y); if(s[0]=='Q') printf("%d\n",query(x,y)); else if(s[0]=='A') add(x,y); else add(x,-y); } } int main() { // freopen("case.txt","r",stdin); int _; scanf("%d",&_); while(_--) run(); return 0; }