一维的情况 #include <iostream> using namespace std; int a[10000];//原始数据数组 int c[10000];//树状数组 int N; int lowbit(int n) { return n&(-n); } void modify(int n,int delta) { while(n <= N) {c[n]+=delta;n+=lowbit(n);} } int sum(int n) { int result=0; while(n!=0) { result+=c[n];n-=lowbit(n); } return result; } int main() { while(cin>>N) { for(int i=1;i<=N;i++) { scanf("%d",&a[i]); modify(i,a[i]); } while(1) { int k; cin>>k; cout<<sum(k)<<endl; } } } 二维情况 #include <iostream> using namespace std; int a[1000][1000];//原始数据数组 int c[1000][1000];//树状数组 int N; int lowbit(int n) { return n&(-n); } void modify(int x,int y,int delta) { for(int i=x;i<=N;i+=lowbit(i)) for(int j=y;j<=N;j+=lowbit(j)) c[i][j]+=delta; } int sum(int x,int y) { int result=0; for(int i=x;i>0;i-=lowbit(i)) for(int j=y;j>0;j-=lowbit(j)) result+=c[i][j]; return result; } int main() { while(cin>>N) { memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) { scanf("%d",&a[i][j]); modify(i,j,a[i][j]); } while(1) { int x,y; cin>>x>>y; cout<<sum(x,y)<<endl; } } }