Descrição do problema
Após a última falha, Remilia decidiu lançar mutação Hongwu novamente, mas para evitar volta descartar sonho espiritual, ela decidiu lançar a batalha estranha Hongwu.
Vamos ser visto como uma aldeia fantasia \ (n \ times m \) área quadrados, não iniciar qualquer um dos área Hongwu é coberto. Remilia cada pé em uma área, cada emitido um infinitamente longo Hongwu quatro direções caminhão, pode afetar a coluna inteira linha / inteira, mas não afeta essa área de sua estação. Se a dois patches Hongwu colisão, porque a densidade é muito grande e vai resolver desaparecer. Reimu ciente desta mutação, a decisão de resolvê-lo. Mas antes de resolver, sonhos espirituais para entender uma gama de densidade Hongwu. Duas operações podem ser simplesmente descritos como:
1 x y
Remilia que estão coordenadas \ ((x, y) \ ) posição de libertação para as infinitas Hongwu quatro direcções.
2 x1 y1 x2 y2
Interrogação ponto superior esquerda \ ((X1, Y1) \) , um ponto inferior direito \ ((x2, y2) \ ) dentro do rectângulo, o número de áreas cobertas Hong Wu.
solução do problema
O lugar também é considerado liquidação de pé.
Manutenção de duas linha de árvore, uma linha de manutenção, uma coluna de manutenção, a modificação de um único ponto, o intervalo de consulta (lata árvore Fenwick)
Conjunto \ (R, C \) representam as linhas e colunas são cobertas com o número, a resposta é de $ r \ vezes (y2 - y1 + 1) + C \ vezes (x2 - x1 + 1) - 2 \ vezes r \ vezes C $ .
Menos duas vezes \ (R \ times C \) razões: fileiras remove de estatísticas de cada vez.
\ (\ Mathrm {code} \)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100000 + 7;
const int maxm = 200000 + 7;
int n, m, T;
template < typename Tp >
void read(Tp &x) {
x = 0;char ch = 1;int fh = 1;
while(ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if(ch == '-') fh = -1, ch=getchar();
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
x *= fh;
}
void Init(void) {
read(n); read(m); read(T);
}
struct Segment_Tree {
#define lfc (x << 1)
#define rgc ((x << 1) | 1)
#define mid ((l + r) >> 1)
int val[maxn << 2];
void modify(int x, int l, int r, int pos) {
if(l == r) {
val[x] = 1 - val[x];
return ;
}
if(pos <= mid) modify(lfc, l, mid, pos);
else modify(rgc, mid + 1, r, pos);
val[x] = val[lfc] + val[rgc];
}
int query(int x, int l, int r, int L, int R) {
if(L <= l && r <= R) return val[x];
if(r < L || l > R) return 0;
return query(lfc, l, mid, L, R) + query(rgc, mid + 1, r, L, R);
}
}row, column;
void operator1(void) {
int x, y;
read(x); read(y);
row.modify(1, 1, n, x);
column.modify(1, 1, m, y);
}
void operator2(void) {
int x1, x2, y1, y2;
read(x1); read(y1); read(x2); read(y2);
int R = row.query(1, 1, n, x1, x2), C = column.query(1, 1, m, y1, y2);
LL ans = (LL)(y2 - y1 + 1) * (LL)R + (x2 - x1 + 1) *(LL)C - (LL)R * (LL)C * 2ll;
printf("%lld\n", ans);
}
void Work(void) {
while(T--) {
int op; read(op);
if(op == 1) operator1();
else operator2();
}
}
int main(void) {
Init();
Work();
return 0;
}