//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
struct Line {
map<int,int> seg;
// tách [x, ...] nếu cần và trả iterator tới đoạn bắt đầu tại x (hoặc vị trí chèn)
inline 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 pre = prev(it);
if (pre->second < x) return it;
if (pre->second == x-1) return it;
int l = pre->first, r = pre->second;
pre->second = x-1;
return seg.emplace_hint(it, x, r);
}
// lật [l, r] và trả về delta chu vi trên line này
inline ll flip(int l, int r){
if (l > r) return 0;
auto itl = split(l), itr = split(r+1);
ll cover = 0;
int cur = l;
// thu các đoạn đang tắt trong [l,r] để sau chèn lại (chính là “gaps”)
static vector<pii> add; add.clear(); add.reserve(8);
for (auto it = itl; it != itr; ++it){
int a = it->first, b = it->second;
if (cur < a) add.emplace_back(cur, a-1);
cover += (ll)(b - a + 1);
cur = b + 1;
}
if (cur <= r) add.emplace_back(cur, r);
// xoá các đoạn đang bật trong [l,r]
seg.erase(itl, itr);
// chèn lại các khoảng trống (giờ sẽ bật) dùng hint để O(1) amortized per insert
auto hint = seg.lower_bound(l);
for (auto &p : add) hint = seg.emplace_hint(hint, p.first, p.second);
// delta chu vi trên line = |[l,r]| - 2 * (độ dài phần đã bật trong [l,r])
return (ll)(r - l + 1) - 2*cover;
}
};
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> hor, ver; // hor: theo x (hàng), ver: theo y (cột)
hor.reserve(Q*2+16); ver.reserve(Q*2+16);
hor.max_load_factor(0.7f);
ver.max_load_factor(0.7f);
auto get_h = [&](int i) -> Line& {
auto it = hor.find(i);
if (it == hor.end()) it = hor.emplace(i, Line()).first;
return it->second;
};
auto get_v = [&](int j) -> Line& {
auto it = ver.find(j);
if (it == ver.end()) it = ver.emplace(j, Line()).first;
return it->second;
};
ll ans = 0;
while (Q--){
int x1,x2,y1,y2; cin >> x1 >> x2 >> y1 >> y2;
// 4 biên của hình chữ nhật
ans += get_h(x1-1).flip(y1, y2);
ans += get_h(x2).flip(y1, y2);
ans += get_v(y1-1).flip(x1, x2);
ans += get_v(y2).flip(x1, x2);
cout << ans << '\n';
}
return 0;
}
Ly8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QsdW5yb2xsLWxvb3BzIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsdHVuZT1uYXRpdmUiKQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnVzaW5nIGxsID0gbG9uZyBsb25nOwp1c2luZyBwaWkgPSBwYWlyPGludCxpbnQ+OwoKc3RydWN0IExpbmUgewogICAgbWFwPGludCxpbnQ+IHNlZzsKCiAgICAvLyB0w6FjaCBbeCwgLi4uXSBu4bq/dSBj4bqnbiB2w6AgdHLhuqMgaXRlcmF0b3IgdOG7m2kgxJFv4bqhbiBi4bqvdCDEkeG6p3UgdOG6oWkgeCAoaG/hurdjIHbhu4sgdHLDrSBjaMOobikKICAgIGlubGluZSBtYXA8aW50LGludD46Oml0ZXJhdG9yIHNwbGl0KGludCB4KXsKICAgICAgICBhdXRvIGl0ID0gc2VnLmxvd2VyX2JvdW5kKHgpOwogICAgICAgIGlmIChpdCAhPSBzZWcuZW5kKCkgJiYgaXQtPmZpcnN0ID09IHgpIHJldHVybiBpdDsKICAgICAgICBpZiAoaXQgPT0gc2VnLmJlZ2luKCkpIHJldHVybiBpdDsKICAgICAgICBhdXRvIHByZSA9IHByZXYoaXQpOwogICAgICAgIGlmIChwcmUtPnNlY29uZCA8IHgpIHJldHVybiBpdDsKICAgICAgICBpZiAocHJlLT5zZWNvbmQgPT0geC0xKSByZXR1cm4gaXQ7CiAgICAgICAgaW50IGwgPSBwcmUtPmZpcnN0LCByID0gcHJlLT5zZWNvbmQ7CiAgICAgICAgcHJlLT5zZWNvbmQgPSB4LTE7CiAgICAgICAgcmV0dXJuIHNlZy5lbXBsYWNlX2hpbnQoaXQsIHgsIHIpOwogICAgfQoKICAgIC8vIGzhuq10IFtsLCByXSB2w6AgdHLhuqMgduG7gSBkZWx0YSBjaHUgdmkgdHLDqm4gbGluZSBuw6B5CiAgICBpbmxpbmUgbGwgZmxpcChpbnQgbCwgaW50IHIpewogICAgICAgIGlmIChsID4gcikgcmV0dXJuIDA7CiAgICAgICAgYXV0byBpdGwgPSBzcGxpdChsKSwgaXRyID0gc3BsaXQocisxKTsKICAgICAgICBsbCBjb3ZlciA9IDA7CiAgICAgICAgaW50IGN1ciA9IGw7CgogICAgICAgIC8vIHRodSBjw6FjIMSRb+G6oW4gxJFhbmcgdOG6r3QgdHJvbmcgW2wscl0gxJHhu4Mgc2F1IGNow6huIGzhuqFpIChjaMOtbmggbMOgIOKAnGdhcHPigJ0pCiAgICAgICAgc3RhdGljIHZlY3RvcjxwaWk+IGFkZDsgYWRkLmNsZWFyKCk7IGFkZC5yZXNlcnZlKDgpOwogICAgICAgIGZvciAoYXV0byBpdCA9IGl0bDsgaXQgIT0gaXRyOyArK2l0KXsKICAgICAgICAgICAgaW50IGEgPSBpdC0+Zmlyc3QsIGIgPSBpdC0+c2Vjb25kOwogICAgICAgICAgICBpZiAoY3VyIDwgYSkgYWRkLmVtcGxhY2VfYmFjayhjdXIsIGEtMSk7CiAgICAgICAgICAgIGNvdmVyICs9IChsbCkoYiAtIGEgKyAxKTsKICAgICAgICAgICAgY3VyID0gYiArIDE7CiAgICAgICAgfQogICAgICAgIGlmIChjdXIgPD0gcikgYWRkLmVtcGxhY2VfYmFjayhjdXIsIHIpOwoKICAgICAgICAvLyB4b8OhIGPDoWMgxJFv4bqhbiDEkWFuZyBi4bqtdCB0cm9uZyBbbCxyXQogICAgICAgIHNlZy5lcmFzZShpdGwsIGl0cik7CgogICAgICAgIC8vIGNow6huIGzhuqFpIGPDoWMga2hv4bqjbmcgdHLhu5FuZyAoZ2nhu50gc+G6vSBi4bqtdCkgZMO5bmcgaGludCDEkeG7gyBPKDEpIGFtb3J0aXplZCBwZXIgaW5zZXJ0CiAgICAgICAgYXV0byBoaW50ID0gc2VnLmxvd2VyX2JvdW5kKGwpOwogICAgICAgIGZvciAoYXV0byAmcCA6IGFkZCkgaGludCA9IHNlZy5lbXBsYWNlX2hpbnQoaGludCwgcC5maXJzdCwgcC5zZWNvbmQpOwoKICAgICAgICAvLyBkZWx0YSBjaHUgdmkgdHLDqm4gbGluZSA9IHxbbCxyXXwgLSAyICogKMSR4buZIGTDoGkgcGjhuqduIMSRw6MgYuG6rXQgdHJvbmcgW2wscl0pCiAgICAgICAgcmV0dXJuIChsbCkociAtIGwgKyAxKSAtIDIqY292ZXI7CiAgICB9Cn07CgppbnQgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgTiwgTSwgUTsKICAgIGlmKCEoY2luID4+IE4gPj4gTSA+PiBRKSkgcmV0dXJuIDA7CgogICAgdW5vcmRlcmVkX21hcDxpbnQsIExpbmU+IGhvciwgdmVyOyAgICAgICAgICAgLy8gaG9yOiB0aGVvIHggKGjDoG5nKSwgdmVyOiB0aGVvIHkgKGPhu5l0KQogICAgaG9yLnJlc2VydmUoUSoyKzE2KTsgdmVyLnJlc2VydmUoUSoyKzE2KTsKICAgIGhvci5tYXhfbG9hZF9mYWN0b3IoMC43Zik7CiAgICB2ZXIubWF4X2xvYWRfZmFjdG9yKDAuN2YpOwoKICAgIGF1dG8gZ2V0X2ggPSBbJl0oaW50IGkpIC0+IExpbmUmIHsKICAgICAgICBhdXRvIGl0ID0gaG9yLmZpbmQoaSk7CiAgICAgICAgaWYgKGl0ID09IGhvci5lbmQoKSkgaXQgPSBob3IuZW1wbGFjZShpLCBMaW5lKCkpLmZpcnN0OwogICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwogICAgfTsKICAgIGF1dG8gZ2V0X3YgPSBbJl0oaW50IGopIC0+IExpbmUmIHsKICAgICAgICBhdXRvIGl0ID0gdmVyLmZpbmQoaik7CiAgICAgICAgaWYgKGl0ID09IHZlci5lbmQoKSkgaXQgPSB2ZXIuZW1wbGFjZShqLCBMaW5lKCkpLmZpcnN0OwogICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwogICAgfTsKCiAgICBsbCBhbnMgPSAwOwogICAgd2hpbGUgKFEtLSl7CiAgICAgICAgaW50IHgxLHgyLHkxLHkyOyBjaW4gPj4geDEgPj4geDIgPj4geTEgPj4geTI7CiAgICAgICAgLy8gNCBiacOqbiBj4bunYSBow6xuaCBjaOG7ryBuaOG6rXQKICAgICAgICBhbnMgKz0gZ2V0X2goeDEtMSkuZmxpcCh5MSwgeTIpOwogICAgICAgIGFucyArPSBnZXRfaCh4MikuZmxpcCh5MSwgeTIpOwogICAgICAgIGFucyArPSBnZXRfdih5MS0xKS5mbGlwKHgxLCB4Mik7CiAgICAgICAgYW5zICs9IGdldF92KHkyKS5mbGlwKHgxLCB4Mik7CiAgICAgICAgY291dCA8PCBhbnMgPDwgJ1xuJzsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==