思路:二为梳妆数组模版;
题目给的操作就两个,更新区间值,区间求和;
c[i][j]表示左上标为(0,0)右下标为(i,j)的正方形区间的和sum(i,j);
明白sum(i,j)的意思之后呢,就知道中间某块矩形的和该怎么求了,可以参考下图;
(1,2,3,4)的和 - (1,3)的和 - (1,2)的和 + (1)的和 = (4)的和;
/*****************************************
Author :Crazy_AC(JamesQi)
Time :2015
File Name :
*****************************************/
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h>
using namespace std;
#define MEM(a,b) memset(a,b,sizeof a)
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> ii;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
inline int Readint(){
char c = getchar();
while(!isdigit(c)) c = getchar();
int x = 0;
while(isdigit(c)){
x = x * 10 + c - '0';
c = getchar();
}
return x;
}
const int N = 2005;
int n,c[N][N],ans[N],x,y;
inline int lowbit(int x){
return x & (-x);
}
int sum(int x,int y){
int ret = 0;
for (int i = x;i > 0;i -= lowbit(i)){
for (int j = y;j > 0;j -= lowbit(j)){
ret += c[i][j];
}
}
return ret;
}
void updata(int x,int y,int d){
for (int i = x; i <= n;i+=lowbit(i)){
for (int j = y;j <= n;j += lowbit(j)){
c[i][j] += d;
}
}
return ;
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int i,k;
while(scanf("%d%d",&i,&n) != EOF){
memset(c,0,sizeof c);
while(true){
int op;
scanf("%d",&op);
if (op == 3)
break;
if (op == 1){
scanf("%d%d%d",&x,&y,&k);
updata(x + 1,y + 1,k);
}
else {
int l,b,r,t;
scanf("%d%d%d%d",&l,&b,&r,&t);
l++,b++,r++,t++;
printf("%d\n",sum(r,t) - sum(l - 1,t) - sum(r,b - 1) + sum(l - 1,b - 1));
}
}
}
return 0;
}