#include <bits/stdc++.h>
using namespace std;
struct Line {
int L = 0; // độ dài của đường
map<int,int> seg; // các đoạn 1 không giao nhau [l,r]
long long ones = 0; // tổng số ô 1 trên đường
Line() {}
Line(int _L): L(_L) {}
// Chia đoạn tại vị trí x (tạo đoạn bắt đầu ở x nếu cần), trả iterator tới
// phần tử có key >= x.
map<int,int>::iterator split(int x){
auto it = seg.lower_bound(x);
if (it != seg.end() && it->first == x) return it;
if (it == seg.begin()) return it;
auto prv = prev(it);
if (prv->second < x) return it;
if (prv->second == x-1) return it;
int l = prv->first, r = prv->second;
prv->second = x-1;
return seg.emplace(x, r).first;
}
// Thêm đoạn [l,r] (đã biết không giao với các đoạn bên trong vùng vừa xóa),
// nhưng có thể cần gộp với hàng xóm hai bên.
void add(int l, int r){
if (l > r) return;
auto it = seg.lower_bound(l);
int nl = l, nr = r;
if (it != seg.begin()){
auto p = prev(it);
if (p->second + 1 >= nl){
nl = min(nl, p->first);
nr = max(nr, p->second);
it = seg.erase(p);
}
}
while (it != seg.end() && it->first <= nr + 1){
nr = max(nr, it->second);
it = seg.erase(it);
}
seg.emplace(nl, nr);
}
// Lật XOR đoạn [l,r], trả về độ tăng/giảm số ô 1 trên đường
long long flip(int l, int r){
if (l > r) return 0;
auto itR = split(r+1);
auto itL = split(l);
long long covered = 0; // số ô 1 trước khi lật trong [l,r]
int cur = l;
vector<pair<int,int>> gaps; // các khoảng 0 trong [l,r] sẽ trở thành 1
for (auto it = itL; it != itR; ++it){
int a = it->first, b = it->second;
if (cur < a) gaps.emplace_back(cur, a-1);
covered += (long long)b - a + 1;
cur = b + 1;
}
if (cur <= r) gaps.emplace_back(cur, r);
seg.erase(itL, itR); // các đoạn 1 bên trong [l,r] trở thành 0
for (auto &g : gaps) add(g.first, g.second); // các khoảng 0 trở thành 1
long long delta = (long long)(r - l + 1) - 2*covered;
ones += delta;
return delta;
}
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M, Q;
if(!(cin >> N >> M >> Q)) return 0;
unordered_map<int, Line> V, H; // V: đường biên ngang (giữa hàng i và i+1), độ dài M
// H: đường biên dọc (giữa cột j và j+1), độ dài N
V.reserve(Q*2+10);
H.reserve(Q*2+10);
auto getV = [&](int i) -> Line& {
auto it = V.find(i);
if (it == V.end()) it = V.emplace(i, Line(M)).first;
return it->second;
};
auto getH = [&](int j) -> Line& {
auto it = H.find(j);
if (it == H.end()) it = H.emplace(j, Line(N)).first;
return it->second;
};
long long ans = 0;
for (int qi = 0; qi < Q; ++qi){
int x1, x2, y1, y2;
cin >> x1 >> x2 >> y1 >> y2; // giả sử input đã đảm bảo x1<=x2, y1<=y2
ans += getV(x1-1).flip(y1, y2);
ans += getV(x2).flip(y1, y2);
ans += getH(y1-1).flip(x1, x2);
ans += getH(y2).flip(x1, x2);
cout << ans << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTGluZSB7CiAgICBpbnQgTCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDEkeG7mSBkw6BpIGPhu6dhIMSRxrDhu51uZwogICAgbWFwPGludCxpbnQ+IHNlZzsgICAgICAgICAgICAgICAgICAgLy8gY8OhYyDEkW/huqFuIDEga2jDtG5nIGdpYW8gbmhhdSBbbCxyXQogICAgbG9uZyBsb25nIG9uZXMgPSAwOyAgICAgICAgICAgICAgICAgLy8gdOG7lW5nIHPhu5Egw7QgMSB0csOqbiDEkcaw4budbmcKCiAgICBMaW5lKCkge30KICAgIExpbmUoaW50IF9MKTogTChfTCkge30KCiAgICAvLyBDaGlhIMSRb+G6oW4gdOG6oWkgduG7iyB0csOtIHggKHThuqFvIMSRb+G6oW4gYuG6r3QgxJHhuqd1IOG7nyB4IG7hur91IGPhuqduKSwgdHLhuqMgaXRlcmF0b3IgdOG7m2kKICAgIC8vIHBo4bqnbiB04butIGPDsyBrZXkgPj0geC4KICAgIG1hcDxpbnQsaW50Pjo6aXRlcmF0b3Igc3BsaXQoaW50IHgpewogICAgICAgIGF1dG8gaXQgPSBzZWcubG93ZXJfYm91bmQoeCk7CiAgICAgICAgaWYgKGl0ICE9IHNlZy5lbmQoKSAmJiBpdC0+Zmlyc3QgPT0geCkgcmV0dXJuIGl0OwogICAgICAgIGlmIChpdCA9PSBzZWcuYmVnaW4oKSkgcmV0dXJuIGl0OwogICAgICAgIGF1dG8gcHJ2ID0gcHJldihpdCk7CiAgICAgICAgaWYgKHBydi0+c2Vjb25kIDwgeCkgcmV0dXJuIGl0OwogICAgICAgIGlmIChwcnYtPnNlY29uZCA9PSB4LTEpIHJldHVybiBpdDsKICAgICAgICBpbnQgbCA9IHBydi0+Zmlyc3QsIHIgPSBwcnYtPnNlY29uZDsKICAgICAgICBwcnYtPnNlY29uZCA9IHgtMTsKICAgICAgICByZXR1cm4gc2VnLmVtcGxhY2UoeCwgcikuZmlyc3Q7CiAgICB9CgogICAgLy8gVGjDqm0gxJFv4bqhbiBbbCxyXSAoxJHDoyBiaeG6v3Qga2jDtG5nIGdpYW8gduG7m2kgY8OhYyDEkW/huqFuIGLDqm4gdHJvbmcgdsO5bmcgduG7q2EgeMOzYSksCiAgICAvLyBuaMawbmcgY8OzIHRo4buDIGPhuqduIGfhu5lwIHbhu5tpIGjDoG5nIHjDs20gaGFpIGLDqm4uCiAgICB2b2lkIGFkZChpbnQgbCwgaW50IHIpewogICAgICAgIGlmIChsID4gcikgcmV0dXJuOwogICAgICAgIGF1dG8gaXQgPSBzZWcubG93ZXJfYm91bmQobCk7CiAgICAgICAgaW50IG5sID0gbCwgbnIgPSByOwogICAgICAgIGlmIChpdCAhPSBzZWcuYmVnaW4oKSl7CiAgICAgICAgICAgIGF1dG8gcCA9IHByZXYoaXQpOwogICAgICAgICAgICBpZiAocC0+c2Vjb25kICsgMSA+PSBubCl7CiAgICAgICAgICAgICAgICBubCA9IG1pbihubCwgcC0+Zmlyc3QpOwogICAgICAgICAgICAgICAgbnIgPSBtYXgobnIsIHAtPnNlY29uZCk7CiAgICAgICAgICAgICAgICBpdCA9IHNlZy5lcmFzZShwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aGlsZSAoaXQgIT0gc2VnLmVuZCgpICYmIGl0LT5maXJzdCA8PSBuciArIDEpewogICAgICAgICAgICBuciA9IG1heChuciwgaXQtPnNlY29uZCk7CiAgICAgICAgICAgIGl0ID0gc2VnLmVyYXNlKGl0KTsKICAgICAgICB9CiAgICAgICAgc2VnLmVtcGxhY2UobmwsIG5yKTsKICAgIH0KCiAgICAvLyBM4bqtdCBYT1IgxJFv4bqhbiBbbCxyXSwgdHLhuqMgduG7gSDEkeG7mSB0xINuZy9naeG6o20gc+G7kSDDtCAxIHRyw6puIMSRxrDhu51uZwogICAgbG9uZyBsb25nIGZsaXAoaW50IGwsIGludCByKXsKICAgICAgICBpZiAobCA+IHIpIHJldHVybiAwOwogICAgICAgIGF1dG8gaXRSID0gc3BsaXQocisxKTsKICAgICAgICBhdXRvIGl0TCA9IHNwbGl0KGwpOwoKICAgICAgICBsb25nIGxvbmcgY292ZXJlZCA9IDA7ICAgICAgICAgICAgICAvLyBz4buRIMO0IDEgdHLGsOG7m2Mga2hpIGzhuq10IHRyb25nIFtsLHJdCiAgICAgICAgaW50IGN1ciA9IGw7CiAgICAgICAgdmVjdG9yPHBhaXI8aW50LGludD4+IGdhcHM7ICAgICAgICAgLy8gY8OhYyBraG/huqNuZyAwIHRyb25nIFtsLHJdIHPhur0gdHLhu58gdGjDoG5oIDEKICAgICAgICBmb3IgKGF1dG8gaXQgPSBpdEw7IGl0ICE9IGl0UjsgKytpdCl7CiAgICAgICAgICAgIGludCBhID0gaXQtPmZpcnN0LCBiID0gaXQtPnNlY29uZDsKICAgICAgICAgICAgaWYgKGN1ciA8IGEpIGdhcHMuZW1wbGFjZV9iYWNrKGN1ciwgYS0xKTsKICAgICAgICAgICAgY292ZXJlZCArPSAobG9uZyBsb25nKWIgLSBhICsgMTsKICAgICAgICAgICAgY3VyID0gYiArIDE7CiAgICAgICAgfQogICAgICAgIGlmIChjdXIgPD0gcikgZ2Fwcy5lbXBsYWNlX2JhY2soY3VyLCByKTsKCiAgICAgICAgc2VnLmVyYXNlKGl0TCwgaXRSKTsgICAgICAgICAgICAgICAgLy8gY8OhYyDEkW/huqFuIDEgYsOqbiB0cm9uZyBbbCxyXSB0cuG7nyB0aMOgbmggMAogICAgICAgIGZvciAoYXV0byAmZyA6IGdhcHMpIGFkZChnLmZpcnN0LCBnLnNlY29uZCk7ICAvLyBjw6FjIGtob+G6o25nIDAgdHLhu58gdGjDoG5oIDEKCiAgICAgICAgbG9uZyBsb25nIGRlbHRhID0gKGxvbmcgbG9uZykociAtIGwgKyAxKSAtIDIqY292ZXJlZDsKICAgICAgICBvbmVzICs9IGRlbHRhOwogICAgICAgIHJldHVybiBkZWx0YTsKICAgIH0KfTsKCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGludCBOLCBNLCBROwogICAgaWYoIShjaW4gPj4gTiA+PiBNID4+IFEpKSByZXR1cm4gMDsKCiAgICB1bm9yZGVyZWRfbWFwPGludCwgTGluZT4gViwgSDsgICAvLyBWOiDEkcaw4budbmcgYmnDqm4gbmdhbmcgKGdp4buvYSBow6BuZyBpIHbDoCBpKzEpLCDEkeG7mSBkw6BpIE0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEg6IMSRxrDhu51uZyBiacOqbiBk4buNYyAgKGdp4buvYSBj4buZdCBqIHbDoCBqKzEpLCDEkeG7mSBkw6BpIE4KICAgIFYucmVzZXJ2ZShRKjIrMTApOwogICAgSC5yZXNlcnZlKFEqMisxMCk7CgogICAgYXV0byBnZXRWID0gWyZdKGludCBpKSAtPiBMaW5lJiB7CiAgICAgICAgYXV0byBpdCA9IFYuZmluZChpKTsKICAgICAgICBpZiAoaXQgPT0gVi5lbmQoKSkgaXQgPSBWLmVtcGxhY2UoaSwgTGluZShNKSkuZmlyc3Q7CiAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CiAgICB9OwogICAgYXV0byBnZXRIID0gWyZdKGludCBqKSAtPiBMaW5lJiB7CiAgICAgICAgYXV0byBpdCA9IEguZmluZChqKTsKICAgICAgICBpZiAoaXQgPT0gSC5lbmQoKSkgaXQgPSBILmVtcGxhY2UoaiwgTGluZShOKSkuZmlyc3Q7CiAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CiAgICB9OwoKICAgIGxvbmcgbG9uZyBhbnMgPSAwOwogICAgZm9yIChpbnQgcWkgPSAwOyBxaSA8IFE7ICsrcWkpewogICAgICAgIGludCB4MSwgeDIsIHkxLCB5MjsKICAgICAgICBjaW4gPj4geDEgPj4geDIgPj4geTEgPj4geTI7ICAgLy8gZ2nhuqMgc+G7rSBpbnB1dCDEkcOjIMSR4bqjbSBi4bqjbyB4MTw9eDIsIHkxPD15MgoKICAgICAgICBhbnMgKz0gZ2V0Vih4MS0xKS5mbGlwKHkxLCB5Mik7CiAgICAgICAgYW5zICs9IGdldFYoeDIpLmZsaXAoeTEsIHkyKTsKICAgICAgICBhbnMgKz0gZ2V0SCh5MS0xKS5mbGlwKHgxLCB4Mik7CiAgICAgICAgYW5zICs9IGdldEgoeTIpLmZsaXAoeDEsIHgyKTsKCiAgICAgICAgY291dCA8PCBhbnMgPDwgJ1xuJzsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==