樹狀陣列 修改區間查詢單點
阿新 • • 發佈:2019-01-14
https://blog.csdn.net/qq_34990731/article/details/82889654
https://www.luogu.org/problemnew/show/P3368
#include<iostream> #include<cstdio> using namespace std; int b[500100],n,c[500100]; int lowbit(int i)//樹狀陣列嘗龜操作 { return i&(-i); } void change(int i,int num) { while(i<=n) { b[i]+=num;//b儲存的是修改的值 i+=lowbit(i); } return ; } int sum(int i) { int ans=0; while(i>0) { ans+=b[i]; i-=lowbit(i); } return ans; } int main() { int m; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&c[i]);//輸入資料 } for(int i=1;i<=m;i++) { int d,x,y,k; scanf("%d",&d); if(d==1) { scanf("%d %d %d",&x,&y,&k);//修改區間 change(x,k); change(y+1,-k); } else { scanf("%d",&x); int ans; ans=sum(x);//單點查詢 printf("%d \n",ans+c[x]); } } return 0; }