Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(linker, "/STACK:100000000")
- #include <iostream>
- #include <algorithm>
- #include <memory.h>
- #include <cstring>
- #include <sstream>
- #include <cstdlib>
- #include <complex>
- #include <string>
- #include <bitset>
- #include <vector>
- #include <cstdio>
- #include <ctime>
- #include <cmath>
- #include <queue>
- #include <stack>
- #include <set>
- #include <map>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef unsigned long long ull;
- typedef complex < double > cd;
- const bool db = false;
- #define mp make_pair
- #define pb push_back
- #define ppb pop_back
- #define sd second
- #define fs first
- #define inf 1000000007
- #define nmax 100010
- #define mmax 100010
- #define eps 1e-9
- const int Magic = 1801, Size = 1010;
- ll s[Size][Size], inc[Size][Size], ans;
- int chlx[Magic], chly[Magic];
- int chrx[Magic], chry[Magic], chv[Magic];
- int cur, n, m, pt;
- int q, lx, ly, rx, ry, f, v;
- inline ll Get(int Lx, int Ly, int Rx, int Ry) {
- return s[Rx][Ry] - s[Lx - 1][Ry] - s[Rx][Ly - 1] + s[Lx - 1][Ly - 1];
- }
- void Rebuild() {
- for(int i = 0; i <= n + 1; ++i)
- for(int j = 0; j <= m + 1; ++j)
- inc[i][j] = 0;
- for(int i = n; i >= 1; --i)
- for(int j = m; j >= 1; --j)
- s[i][j] -= s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
- for(int i = 1; i <= pt; ++i) {
- lx = chlx[i]; ly = chly[i];
- rx = chrx[i]; ry = chry[i];
- inc[lx][ly] += chv[i];
- inc[rx + 1][ly] -= chv[i];
- inc[lx][ry + 1] -= chv[i];
- inc[rx + 1][ry + 1] += chv[i];
- }
- for(int i = 1; i <= n; ++i)
- for(int j = 1; j <= m; ++j) {
- inc[i][j] += inc[i - 1][j] + inc[i][j - 1] - inc[i - 1][j - 1];
- s[i][j] = s[i][j] + inc[i][j] + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
- }
- }
- int main() {
- //freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
- //freopen("a.in", "r", stdin); freopen("a.out", "w", stdout);
- //ios :: sync_with_stdio(false);
- scanf("%d%d%d", &n, &m, &q);
- while(q --> 0) {
- scanf("%d%d%d%d%d", &f, &lx, &ly, &rx, &ry);
- if(f == 1) {
- scanf("%d", &v); ++pt;
- chlx[pt] = lx; chly[pt] = ly; chrx[pt] = rx; chry[pt] = ry; chv[pt] = v;
- if(pt + 1 == Magic) {
- Rebuild();
- pt = 0;
- }
- } else {
- ans = Get(lx, ly, rx, ry);
- for(int i = 1; i <= pt; ++i) {
- int X = min(chrx[i], rx) - max(chlx[i], lx) + 1; if(X < 0) X = 0;
- int Y = min(chry[i], ry) - max(chly[i], ly) + 1; if(Y < 0) Y = 0;
- ans += chv[i] * 1LL * X * 1LL * Y;
- }
- printf("%lld\n", ans);
- }
- }
- cin.get(); cin.get();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment