二维树状数组模板
#include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <set> #include <bitset> #include <queue> #include <stack> #include <string> #include <iostream> #include <cmath> #include <climits> using namespace std; const int MAX=1200; int c[MAX][MAX]; int n; int LowBit(int t) { return t&(-t); } int Sum(int endx,int endy)//(1,1) 到 (endx,endy) 矩阵的和 { int sum=0; int temp=endy; while(endx>0) { endy=temp; while (endy>0) { sum+=c[endx][endy]; endy-=LowBit(endy); } endx-=LowBit(endx); } return sum; } void add(int addx,int addy,int num)//(x,y) 处增加num { int temp=addy; while (addx <=n) { addy=temp; while(addy<=n) { c[addx][addy]+=num; addy+=LowBit(addy); } addx+=LowBit(addx); } } int GetSum(int l,int b,int r,int t)//求 (l,b) (r,t) 矩阵的和 { return Sum(r,t)-Sum(r,b-1)-Sum(l-1,t)+Sum(l-1,b-1); } int main() { int gg; int x; int a1,a2,a3,a4; scanf("%d",&n); while(scanf("%d",&x)!=EOF&&x!=3){ if(x==1){ scanf("%d%d%d",&a1,&a2,&a3); add(a1+1,a2+1,a3); } else{ scanf("%d%d%d%d",&a1,&a2,&a3,&a4); cout<<GetSum(a1+1,a2+1,a3+1,a4+1)<<endl; } } return 0; }