Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define task "TABLE"
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <vector>
- using namespace std;
- using ll = long long;
- using ld = long double;
- constexpr int N = 1e5 + 5;
- int m, n, q;
- int typ[N], x[N], y[N], z[N], t[N];
- ll w[N];
- #define Unique(x) (sort(x.begin(), x.end()), x.resize(unique(x.begin(), x.end()) - x.begin()))
- #define Find(x, v) (lower_bound(x.begin(), x.end(), v) - x.begin() + 1)
- vector<int> a[N];
- struct FenwickTree
- {
- int n;
- vector<ll> fen[N];
- void Assign(int n)
- {
- this->n = n;
- for (int i = 1; i <= n; ++i)
- fen[i].resize(a[i].size(), 0);
- }
- void Update(int x, int y, ll v)
- {
- for (; x <= n; x += x & -x)
- for (int i = Find(a[x], y); i <= (int)a[x].size(); i += i & -i)
- fen[x][i - 1] += v;
- }
- ll Get(int x, int y)
- {
- ll ans(0);
- for (; x; x -= x & -x)
- for (int i = Find(a[x], y); i; i -= i & -i)
- ans += fen[x][i - 1];
- return ans;
- }
- void Update(int x, int y, int z, int t, ll v)
- {
- Update(x, y, v);
- Update(x, t + 1, -v);
- Update(z + 1, y, -v);
- Update(z + 1, t + 1, v);
- }
- } rc, c, r, s;
- void Read()
- {
- cin >> m >> n >> q;
- for (int i = 1; i <= q; ++i)
- {
- cin >> typ[i] >> x[i] >> y[i] >> z[i] >> t[i];
- if (typ[i] == 1)
- cin >> w[i];
- }
- }
- void fake_get(int x, int y)
- {
- for (; x; x -= x & -x)
- a[x].emplace_back(y);
- }
- void CompressTree()
- {
- for (int i = 1; i <= q; ++i)
- if (typ[i] == 2)
- {
- fake_get(z[i], t[i]);
- fake_get(x[i] - 1, t[i]);
- fake_get(z[i], y[i] - 1);
- fake_get(x[i] - 1, y[i] - 1);
- }
- for (int i = 1; i <= m; ++i)
- Unique(a[i]);
- rc.Assign(m);
- r.Assign(m);
- c.Assign(m);
- s.Assign(m);
- }
- ll Get(int x, int y)
- {
- return rc.Get(x, y) * (x + 1) * (y + 1) + r.Get(x, y) * (x + 1) + c.Get(x, y) * (y + 1) + s.Get(x, y);
- }
- ll Get(int x, int y, int z, int t)
- {
- return Get(z, t) - Get(x - 1, t) - Get(z, y - 1) + Get(x - 1, y - 1);
- }
- void Solve()
- {
- for (int i = 1; i <= q; ++i)
- if (typ[i] == 1)
- {
- //
- rc.Update(x[i], y[i], z[i], t[i], w[i]);
- r.Update(x[i], y[i], z[i], t[i], -y[i] * w[i]);
- c.Update(x[i], y[i], z[i], t[i], -x[i] * w[i]);
- s.Update(x[i], y[i], z[i], t[i], w[i] * x[i] * y[i]);
- //
- r.Update(x[i], t[i] + 1, z[i], n, w[i] * (t[i] - y[i] + 1));
- s.Update(x[i], t[i] + 1, z[i], n, -w[i] * x[i] * (t[i] - y[i] + 1));
- //
- c.Update(z[i] + 1, y[i], m, t[i], w[i] * (z[i] - x[i] + 1));
- s.Update(z[i] + 1, y[i], m, t[i], -w[i] * y[i] * (z[i] - x[i] + 1));
- //
- s.Update(z[i] + 1, t[i] + 1, m, n, w[i] * (z[i] - x[i] + 1) * (t[i] - y[i] + 1));
- }
- else
- cout << Get(x[i], y[i], z[i], t[i]) << "\n";
- }
- int32_t main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- if (fopen(task ".INP", "r"))
- {
- freopen(task ".INP", "r", stdin);
- freopen(task ".OUT", "w", stdout);
- }
- Read();
- CompressTree();
- Solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement