#include <bits/stdc++.h>
using namespace std;
// Interval set: map<L, R> for disjoint, merged intervals (both inclusive)
struct IntervalSet {
// All intervals are within [1..LEN]; initially empty (all zeros)
int LEN;
map<int,int> seg;
IntervalSet(int LEN_=0): LEN(LEN_) {}
// split at pos: ensure there's an interval starting at pos; return iterator to interval with start >= pos
map<int,int>::iterator split(int pos){
if(pos > LEN) return seg.end();
auto it = seg.upper_bound(pos);
if(it==seg.begin()) return it;
--it;
int L = it->first, R = it->second;
if(R < pos) return ++it;
if(L == pos) return it;
// [L, R] -> [L, pos-1] and [pos, R]
it->second = pos-1;
return seg.emplace(pos, R).first;
}
// query sum of 1s in [l, r]
long long range_one_len(int l, int r){
if(l>r) return 0;
auto itl = split(l);
auto itr = split(r+1);
long long res = 0;
for(auto it=itl; it!=itr; ++it){
res += (long long)it->second - it->first + 1;
}
return res;
}
// toggle [l, r]: remove ones inside and add the gaps (complement inside)
void toggle(int l, int r){
if(l>r) return;
auto itl = split(l);
auto itr = split(r+1);
// collect existing 1-intervals and build the complement gaps within [l,r]
vector<pair<int,int>> old1; // to erase
vector<pair<int,int>> add1; // to insert (gaps)
int cur = l;
for(auto it=itl; it!=itr; ++it){
int a = it->first, b = it->second;
if(cur <= a-1) add1.push_back({cur, a-1});
old1.push_back({a,b});
cur = b+1;
}
if(cur <= r) add1.push_back({cur, r});
// erase old ones
seg.erase(itl, itr);
// insert gaps and merge if needed
for(auto [a,b]: add1){
if(a>b) continue;
// try merge with prev
auto it = seg.lower_bound(a);
int L=a, R=b;
if(it!=seg.begin()){
auto itp = prev(it);
if(itp->second+1 >= L){
L = itp->first;
R = max(R, itp->second);
seg.erase(itp);
}
}
while(it!=seg.end() && it->first<=R+1){
R = max(R, it->second);
it = seg.erase(it);
}
seg.emplace(L,R);
}
}
};
// two families of lines:
// col[x] for vertical borders between column x and x+1 (x=0..N), length M
// row[y] for horizontal borders between row y and y+1 (y=0..M), length N
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N,M,Q;
if(!(cin>>N>>M>>Q)) return 0;
unordered_map<int, IntervalSet> col, row;
col.reserve(Q*4); row.reserve(Q*4);
auto get_col = [&](int x)->IntervalSet&{
auto it = col.find(x);
if(it==col.end()) it = col.emplace(x, IntervalSet(M)).first;
return it->second;
};
auto get_row = [&](int y)->IntervalSet&{
auto it = row.find(y);
if(it==row.end()) it = row.emplace(y, IntervalSet(N)).first;
return it->second;
};
long long perim = 0;
for(int i=0;i<Q;i++){
int x1,x2,y1,y2;
cin>>x1>>x2>>y1>>y2;
// left vertical boundary at x1-1
{
auto &S = get_col(x1-1);
long long k = S.range_one_len(y1,y2);
S.toggle(y1,y2);
perim += (y2-y1+1) - 2*k;
}
// right vertical boundary at x2
{
auto &S = get_col(x2);
long long k = S.range_one_len(y1,y2);
S.toggle(y1,y2);
perim += (y2-y1+1) - 2*k;
}
// top horizontal boundary at y1-1
{
auto &S = get_row(y1-1);
long long k = S.range_one_len(x1,x2);
S.toggle(x1,x2);
perim += (x2-x1+1) - 2*k;
}
// bottom horizontal boundary at y2
{
auto &S = get_row(y2);
long long k = S.range_one_len(x1,x2);
S.toggle(x1,x2);
perim += (x2-x1+1) - 2*k;
}
cout << perim << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBJbnRlcnZhbCBzZXQ6IG1hcDxMLCBSPiBmb3IgZGlzam9pbnQsIG1lcmdlZCBpbnRlcnZhbHMgKGJvdGggaW5jbHVzaXZlKQpzdHJ1Y3QgSW50ZXJ2YWxTZXQgewogICAgLy8gQWxsIGludGVydmFscyBhcmUgd2l0aGluIFsxLi5MRU5dOyBpbml0aWFsbHkgZW1wdHkgKGFsbCB6ZXJvcykKICAgIGludCBMRU47CiAgICBtYXA8aW50LGludD4gc2VnOwoKICAgIEludGVydmFsU2V0KGludCBMRU5fPTApOiBMRU4oTEVOXykge30KCiAgICAvLyBzcGxpdCBhdCBwb3M6IGVuc3VyZSB0aGVyZSdzIGFuIGludGVydmFsIHN0YXJ0aW5nIGF0IHBvczsgcmV0dXJuIGl0ZXJhdG9yIHRvIGludGVydmFsIHdpdGggc3RhcnQgPj0gcG9zCiAgICBtYXA8aW50LGludD46Oml0ZXJhdG9yIHNwbGl0KGludCBwb3MpewogICAgICAgIGlmKHBvcyA+IExFTikgcmV0dXJuIHNlZy5lbmQoKTsKICAgICAgICBhdXRvIGl0ID0gc2VnLnVwcGVyX2JvdW5kKHBvcyk7CiAgICAgICAgaWYoaXQ9PXNlZy5iZWdpbigpKSByZXR1cm4gaXQ7CiAgICAgICAgLS1pdDsKICAgICAgICBpbnQgTCA9IGl0LT5maXJzdCwgUiA9IGl0LT5zZWNvbmQ7CiAgICAgICAgaWYoUiA8IHBvcykgcmV0dXJuICsraXQ7CiAgICAgICAgaWYoTCA9PSBwb3MpIHJldHVybiBpdDsKICAgICAgICAvLyBbTCwgUl0gLT4gW0wsIHBvcy0xXSBhbmQgW3BvcywgUl0KICAgICAgICBpdC0+c2Vjb25kID0gcG9zLTE7CiAgICAgICAgcmV0dXJuIHNlZy5lbXBsYWNlKHBvcywgUikuZmlyc3Q7CiAgICB9CgogICAgLy8gcXVlcnkgc3VtIG9mIDFzIGluIFtsLCByXQogICAgbG9uZyBsb25nIHJhbmdlX29uZV9sZW4oaW50IGwsIGludCByKXsKICAgICAgICBpZihsPnIpIHJldHVybiAwOwogICAgICAgIGF1dG8gaXRsID0gc3BsaXQobCk7CiAgICAgICAgYXV0byBpdHIgPSBzcGxpdChyKzEpOwogICAgICAgIGxvbmcgbG9uZyByZXMgPSAwOwogICAgICAgIGZvcihhdXRvIGl0PWl0bDsgaXQhPWl0cjsgKytpdCl7CiAgICAgICAgICAgIHJlcyArPSAobG9uZyBsb25nKWl0LT5zZWNvbmQgLSBpdC0+Zmlyc3QgKyAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgfQoKICAgIC8vIHRvZ2dsZSBbbCwgcl06IHJlbW92ZSBvbmVzIGluc2lkZSBhbmQgYWRkIHRoZSBnYXBzIChjb21wbGVtZW50IGluc2lkZSkKICAgIHZvaWQgdG9nZ2xlKGludCBsLCBpbnQgcil7CiAgICAgICAgaWYobD5yKSByZXR1cm47CiAgICAgICAgYXV0byBpdGwgPSBzcGxpdChsKTsKICAgICAgICBhdXRvIGl0ciA9IHNwbGl0KHIrMSk7CgogICAgICAgIC8vIGNvbGxlY3QgZXhpc3RpbmcgMS1pbnRlcnZhbHMgYW5kIGJ1aWxkIHRoZSBjb21wbGVtZW50IGdhcHMgd2l0aGluIFtsLHJdCiAgICAgICAgdmVjdG9yPHBhaXI8aW50LGludD4+IG9sZDE7ICAgICAgICAvLyB0byBlcmFzZQogICAgICAgIHZlY3RvcjxwYWlyPGludCxpbnQ+PiBhZGQxOyAgICAgICAgLy8gdG8gaW5zZXJ0IChnYXBzKQogICAgICAgIGludCBjdXIgPSBsOwogICAgICAgIGZvcihhdXRvIGl0PWl0bDsgaXQhPWl0cjsgKytpdCl7CiAgICAgICAgICAgIGludCBhID0gaXQtPmZpcnN0LCBiID0gaXQtPnNlY29uZDsKICAgICAgICAgICAgaWYoY3VyIDw9IGEtMSkgYWRkMS5wdXNoX2JhY2soe2N1ciwgYS0xfSk7CiAgICAgICAgICAgIG9sZDEucHVzaF9iYWNrKHthLGJ9KTsKICAgICAgICAgICAgY3VyID0gYisxOwogICAgICAgIH0KICAgICAgICBpZihjdXIgPD0gcikgYWRkMS5wdXNoX2JhY2soe2N1ciwgcn0pOwoKICAgICAgICAvLyBlcmFzZSBvbGQgb25lcwogICAgICAgIHNlZy5lcmFzZShpdGwsIGl0cik7CiAgICAgICAgLy8gaW5zZXJ0IGdhcHMgYW5kIG1lcmdlIGlmIG5lZWRlZAogICAgICAgIGZvcihhdXRvIFthLGJdOiBhZGQxKXsKICAgICAgICAgICAgaWYoYT5iKSBjb250aW51ZTsKICAgICAgICAgICAgLy8gdHJ5IG1lcmdlIHdpdGggcHJldgogICAgICAgICAgICBhdXRvIGl0ID0gc2VnLmxvd2VyX2JvdW5kKGEpOwogICAgICAgICAgICBpbnQgTD1hLCBSPWI7CiAgICAgICAgICAgIGlmKGl0IT1zZWcuYmVnaW4oKSl7CiAgICAgICAgICAgICAgICBhdXRvIGl0cCA9IHByZXYoaXQpOwogICAgICAgICAgICAgICAgaWYoaXRwLT5zZWNvbmQrMSA+PSBMKXsKICAgICAgICAgICAgICAgICAgICBMID0gaXRwLT5maXJzdDsKICAgICAgICAgICAgICAgICAgICBSID0gbWF4KFIsIGl0cC0+c2Vjb25kKTsKICAgICAgICAgICAgICAgICAgICBzZWcuZXJhc2UoaXRwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZShpdCE9c2VnLmVuZCgpICYmIGl0LT5maXJzdDw9UisxKXsKICAgICAgICAgICAgICAgIFIgPSBtYXgoUiwgaXQtPnNlY29uZCk7CiAgICAgICAgICAgICAgICBpdCA9IHNlZy5lcmFzZShpdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VnLmVtcGxhY2UoTCxSKTsKICAgICAgICB9CiAgICB9Cn07CgovLyB0d28gZmFtaWxpZXMgb2YgbGluZXM6Ci8vICAgY29sW3hdIGZvciB2ZXJ0aWNhbCBib3JkZXJzIGJldHdlZW4gY29sdW1uIHggYW5kIHgrMSAgKHg9MC4uTiksIGxlbmd0aCBNCi8vICAgcm93W3ldIGZvciBob3Jpem9udGFsIGJvcmRlcnMgYmV0d2VlbiByb3cgeSBhbmQgeSsxICAgKHk9MC4uTSksIGxlbmd0aCBOCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGludCBOLE0sUTsKICAgIGlmKCEoY2luPj5OPj5NPj5RKSkgcmV0dXJuIDA7CgogICAgdW5vcmRlcmVkX21hcDxpbnQsIEludGVydmFsU2V0PiBjb2wsIHJvdzsKICAgIGNvbC5yZXNlcnZlKFEqNCk7IHJvdy5yZXNlcnZlKFEqNCk7CgogICAgYXV0byBnZXRfY29sID0gWyZdKGludCB4KS0+SW50ZXJ2YWxTZXQmewogICAgICAgIGF1dG8gaXQgPSBjb2wuZmluZCh4KTsKICAgICAgICBpZihpdD09Y29sLmVuZCgpKSBpdCA9IGNvbC5lbXBsYWNlKHgsIEludGVydmFsU2V0KE0pKS5maXJzdDsKICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKICAgIH07CiAgICBhdXRvIGdldF9yb3cgPSBbJl0oaW50IHkpLT5JbnRlcnZhbFNldCZ7CiAgICAgICAgYXV0byBpdCA9IHJvdy5maW5kKHkpOwogICAgICAgIGlmKGl0PT1yb3cuZW5kKCkpIGl0ID0gcm93LmVtcGxhY2UoeSwgSW50ZXJ2YWxTZXQoTikpLmZpcnN0OwogICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwogICAgfTsKCiAgICBsb25nIGxvbmcgcGVyaW0gPSAwOwoKICAgIGZvcihpbnQgaT0wO2k8UTtpKyspewogICAgICAgIGludCB4MSx4Mix5MSx5MjsKICAgICAgICBjaW4+PngxPj54Mj4+eTE+PnkyOwoKICAgICAgICAvLyBsZWZ0IHZlcnRpY2FsIGJvdW5kYXJ5IGF0IHgxLTEKICAgICAgICB7CiAgICAgICAgICAgIGF1dG8gJlMgPSBnZXRfY29sKHgxLTEpOwogICAgICAgICAgICBsb25nIGxvbmcgayA9IFMucmFuZ2Vfb25lX2xlbih5MSx5Mik7CiAgICAgICAgICAgIFMudG9nZ2xlKHkxLHkyKTsKICAgICAgICAgICAgcGVyaW0gKz0gKHkyLXkxKzEpIC0gMiprOwogICAgICAgIH0KICAgICAgICAvLyByaWdodCB2ZXJ0aWNhbCBib3VuZGFyeSBhdCB4MgogICAgICAgIHsKICAgICAgICAgICAgYXV0byAmUyA9IGdldF9jb2woeDIpOwogICAgICAgICAgICBsb25nIGxvbmcgayA9IFMucmFuZ2Vfb25lX2xlbih5MSx5Mik7CiAgICAgICAgICAgIFMudG9nZ2xlKHkxLHkyKTsKICAgICAgICAgICAgcGVyaW0gKz0gKHkyLXkxKzEpIC0gMiprOwogICAgICAgIH0KICAgICAgICAvLyB0b3AgaG9yaXpvbnRhbCBib3VuZGFyeSBhdCB5MS0xCiAgICAgICAgewogICAgICAgICAgICBhdXRvICZTID0gZ2V0X3Jvdyh5MS0xKTsKICAgICAgICAgICAgbG9uZyBsb25nIGsgPSBTLnJhbmdlX29uZV9sZW4oeDEseDIpOwogICAgICAgICAgICBTLnRvZ2dsZSh4MSx4Mik7CiAgICAgICAgICAgIHBlcmltICs9ICh4Mi14MSsxKSAtIDIqazsKICAgICAgICB9CiAgICAgICAgLy8gYm90dG9tIGhvcml6b250YWwgYm91bmRhcnkgYXQgeTIKICAgICAgICB7CiAgICAgICAgICAgIGF1dG8gJlMgPSBnZXRfcm93KHkyKTsKICAgICAgICAgICAgbG9uZyBsb25nIGsgPSBTLnJhbmdlX29uZV9sZW4oeDEseDIpOwogICAgICAgICAgICBTLnRvZ2dsZSh4MSx4Mik7CiAgICAgICAgICAgIHBlcmltICs9ICh4Mi14MSsxKSAtIDIqazsKICAgICAgICB9CgogICAgICAgIGNvdXQgPDwgcGVyaW0gPDwgIlxuIjsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==