You are given an N × N matrix. At the beginning every element is 0. Write a program supporting 2 operations:
1. Add x y value: Add value to the element Axy. (Subscripts starts from 0
2. Sum x1 y1 x2 y2: Return the sum of every element Axy for x1 ≤ x ≤ x2, y1 ≤ y ≤ y2.
InputThe first line contains 2 integers N and M, the size of the matrix and the number of operations.
Each of the following M line contains an operation.
1 ≤ N ≤ 1000, 1 ≤ M ≤ 100000
For each Add operation: 0 ≤ x < N, 0 ≤ y < N, -1000000 ≤ value ≤ 1000000
For each Sum operation: 0 ≤ x1 ≤ x2 < N, 0 ≤ y1 ≤ y2 < N
OutputFor each Sum operation output a non-negative number denoting the sum modulo 109+7.
Sample Input
5 8 Add 0 0 1 Sum 0 0 1 1 Add 1 1 1 Sum 0 0 1 1 Add 2 2 1 Add 3 3 1 Add 4 4 -1 Sum 0 0 4 4
Sample Output
1 2 3
1:单点修改值
2:给出一个子矩阵的左上和右下角的坐标,询问一个子矩形范围内的值的和.
#include<queue> #include<set> #include<cstdio> #include <iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; #define max_v 1005 #define mod 1000000007 typedef long long LL; int c[max_v][max_v]; int lowbit(int x) { return x&(-x); } LL getsum(int x,int y) { LL sum=0; for(int i=x;i!=0;i-=lowbit(i)) { for(int j=y;j!=0;j-=lowbit(j)) { sum=(sum+c[i][j]); } } return sum; } void update(int x,int y,int v) { for(int i=x;i<max_v;i+=lowbit(i)) { for(int j=y;j<max_v;j+=lowbit(j)) { c[i][j]=(c[i][j]+v); } } } int main() { char str[10]; int n,m; while(~scanf("%d %d",&n,&m)) { memset(c,0,sizeof(c)); int a,b,w; while(m--) { scanf("%s",str); if(str[0]=='A') { scanf("%d %d %d",&a,&b,&w); a++; b++; update(a,b,w); }else { int sx,sy,ex,ey; scanf("%d %d %d %d",&sx,&sy,&ex,&ey); sx++; sy++; ex++; ey++; printf("%lld\n",(getsum(ex,ey)-getsum(sx-1,ey)-getsum(ex,sy-1)+getsum(sx-1,sy-1)+mod)%mod); } } } return 0; } /* 题目大意:给你一个N*N二维矩阵,初始值时都为0,有两种操作 1:单点修改值 2:给出一个子矩阵的左上和右下角的坐标,询问一个子矩形范围内的值的和. 二维树状数组模板题,单点更新区间查询 */