/* @树状数组扩展:树上差分 区间修改 单点查询 */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> static const int MAXN= (int)(1e3); typedef long long int llong; typedef struct TreeArr{ int detph; int N; int rawArr[MAXN+1]; int diff[MAXN+1]; int t[MAXN+1]; } TreeArr,*ptrToTreeArr; static inline int lowbit(int n){return n&-n;} static void conv(ptrToTreeArr const tp) { memset(tp->t,0,sizeof(tp->t)); register int i = 0,j = 0; for(i = 1;i <= tp->N;++i) tp->diff[i]=tp->rawArr[i]-tp->rawArr[i-1]; for(i = 1;i<=tp->N;++i) for(j = i-lowbit(i)+1;j<=i;++j) tp->t[i]+=tp->Diff[j]; tp->depth = (int)log((double)tp->N)/log(2.0)+1; } static void _conv(ptrToArrTree const tp) { memset(tp->t,0,sizeof(tp->t)); register int i = 0;int p = 0; for(i = 1;i <= tp->N;++i) tp->diff[i]=tp->rawArr[i]-tp->rawArr[i-1]; for(i = 1;i<tp->N;++i) { tp->t[i+lowbit(i)]+=tp->t[i]; tp->t[i]+=tp->Diff[i]; } tp->t[i]+=tp->Diff[i]; } static void singMod(ptrToTreeArr const tp,int p,int v) { tp->Diff[p]+=x; for(;p<tp->N;p+=lowbit(p)) tp-t[p]+=x; } static void rectMod(ptrToTreeArr const tp,int beg,int end,int v) { singMod(tp,beg,v);singMod(tp,end+1,-v); } static void llong prefSum(const ptrToTreeArr tp,int p) //RawArr[p] singQuery //RawArr[0] = 0 { llong pref = 0LL; for(;p;pref+=tp->t[p],p-=lowbit(p)); return pref; }