#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define PhTrNghia "minhomes"
using namespace std;
const int maxn = 1e5 + 5 ;
const int inf = 1e18 ;
struct DSU{
int n;
vector < int > parent, sz;
DSU( int _n) {
n = _n;
parent.assign ( n + 5 , 0 ) ;
sz.assign ( n + 5 , 0 ) ;
for ( int i = 1 ; i <= n; i++ ) {
parent[ i] = i;
sz[ i] = 1 ;
}
}
int find_parent( int u) {
if ( u == parent[ u] ) return u;
return parent[ u] = find_parent( parent[ u] ) ;
}
bool Union( int u, int v) {
u = find_parent( u) ;
v = find_parent( v) ;
if ( u == v) return 0 ;
if ( sz[ u] < sz[ v] ) swap( u, v) ;
sz[ u] + = sz[ v] ;
parent[ v] = u;
return 1 ;
}
} ;
struct phtrnghia{
int type, x, y;
} ;
bool cmp( phtrnghia x, phtrnghia y) {
return x.x < y.x ;
}
bool in( int l, int pos, int r) {
return ( l <= pos && pos <= r) ;
}
bool overlap( phtrnghia a, phtrnghia b) {
bool c1 = ( a.x <= b.x && b.x <= a.y ) ;
bool c2 = ( a.x <= b.y && b.y <= a.y ) ;
bool c3 = ( b.x <= a.x && a.x <= b.y ) ;
bool c4 = ( b.x <= a.y && a.y <= b.y ) ;
return ( c1 or c2 or c3 or c4) ;
}
int n, m, q, cc;
int ans[ maxn] , pre[ maxn] , pref[ maxn] , res[ maxn] , pointer_col[ maxn] , mark[ maxn] ;
vector < phtrnghia> close_col[ maxn] , row[ maxn] , col[ maxn] , col_close[ maxn] , col_open[ maxn] ;
signed main( ) {
ios_base:: sync_with_stdio ( false ) ;
cin .tie ( 0 ) ; cout .tie ( 0 ) ;
if ( fopen ( PhTrNghia".INP" , "r" ) ) {
freopen ( PhTrNghia".INP" , "r" , stdin ) ;
freopen ( PhTrNghia".OUT" , "w" , stdout ) ;
}
cin >> n >> m >> q;
cc = q;
for ( int i = 1 ; i <= q; i++ ) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2; //line
pre[ x1] ++ ;
if ( x1 == x2) {
row[ x1] .push_back ( { i, y1, y2} ) ;
pref[ x1] + = ( y2 - y1 + 1 ) ;
pref[ x1+ 1 ] - = ( y2 - y1 + 1 ) ;
}
if ( x1 == x2 && y1 == y2) continue ;
if ( y1 == y2) {
col_open[ x1] .push_back ( { i, y1, y2} ) ;
col_close[ x2+ 1 ] .push_back ( { i, y1, y2} ) ;
col[ y1] .push_back ( { i, x1, x2} ) ;
close_col[ x2] .push_back ( { i, y1, y2} ) ;
pref[ x1] ++ ;
pref[ x2+ 1 ] -- ;
}
}
for ( int i = 1 ; i <= n; i++ ) {
pre[ i] + = pre[ i- 1 ] ;
pref[ i] + = pref[ i- 1 ] ;
res[ i] = res[ i- 1 ] + pref[ i] ;
sort( row[ i] .begin ( ) , row[ i] .end ( ) , cmp) ;
sort( col_open[ i] .begin ( ) , col_open[ i] .end ( ) , cmp) ;
sort( close_col[ i] .begin ( ) , close_col[ i] .end ( ) , cmp) ;
sort( col[ i] .begin ( ) , col[ i] .end ( ) , cmp) ;
}
DSU dsu( q) ;
for ( int i = 1 ; i <= n; i++ ) {
int idx3 = 0 , idx4 = 0 ;
for ( phtrnghia cur: col_close[ i] ) {
int pos = cur.x ;
mark[ pos] = 0 ;
}
for ( phtrnghia cur: col_open[ i] ) {
int shape = cur.type ;
int pos = cur.x ;
while ( idx3 < row[ i- 1 ] .size ( ) && row[ i- 1 ] [ idx3] .y <= pos) {
if ( in( row[ i- 1 ] [ idx3] .x , pos, row[ i- 1 ] [ idx3] .y ) ) cc - = dsu.Union ( shape, row[ i- 1 ] [ idx3] .type ) ;
idx3++ ;
}
if ( idx3 < row[ i- 1 ] .size ( ) && in( row[ i- 1 ] [ idx3] .x , pos, row[ i- 1 ] [ idx3] .y ) ) cc - = dsu.Union ( shape, row[ i- 1 ] [ idx3] .type ) ;
while ( idx4 < close_col[ i- 1 ] .size ( ) && close_col[ i- 1 ] [ idx4] .y <= pos) {
if ( in( close_col[ i- 1 ] [ idx4] .x , pos, close_col[ i- 1 ] [ idx4] .y ) ) cc - = dsu.Union ( shape, close_col[ i- 1 ] [ idx4] .type ) ;
idx4++ ;
}
if ( idx4 < close_col[ i- 1 ] .size ( ) && in( close_col[ i- 1 ] [ idx4] .x , pos, close_col[ i- 1 ] [ idx4] .y ) ) cc - = dsu.Union ( shape, close_col[ i- 1 ] [ idx4] .type ) ;
if ( mark[ pos- 1 ] ) cc - = dsu.Union ( shape, mark[ pos- 1 ] ) ;
if ( mark[ pos+ 1 ] ) cc - = dsu.Union ( shape, mark[ pos+ 1 ] ) ;
mark[ pos] = shape;
}
int old_shape = inf, old_r = inf, idx1 = 0 , idx2 = 0 ;
for ( phtrnghia cur: row[ i] ) {
int shape = cur.type ;
int L = cur.x ;
int R = cur.y ;
if ( old_r+ 1 == cur.x ) cc - = dsu.Union ( shape, old_shape) ;
while ( idx1 < row[ i- 1 ] .size ( ) && row[ i- 1 ] [ idx1] .y <= cur.y ) {
if ( overlap( cur, row[ i- 1 ] [ idx1] ) ) cc - = dsu.Union ( shape, row[ i- 1 ] [ idx1] .type ) ;
idx1++ ;
}
if ( idx1 < row[ i- 1 ] .size ( ) && overlap( cur, row[ i- 1 ] [ idx1] ) ) cc - = dsu.Union ( shape, row[ i- 1 ] [ idx1] .type ) ;
while ( idx2 < close_col[ i- 1 ] .size ( ) && close_col[ i- 1 ] [ idx2] .y <= cur.y ) {
if ( overlap( cur, close_col[ i- 1 ] [ idx2] ) ) cc - = dsu.Union ( shape, close_col[ i- 1 ] [ idx2] .type ) ;
idx2++ ;
}
if ( idx2 < close_col[ i- 1 ] .size ( ) && overlap( cur, close_col[ i- 1 ] [ idx2] ) ) cc - = dsu.Union ( shape, close_col[ i- 1 ] [ idx2] .type ) ;
while ( pointer_col[ L- 1 ] < col[ L- 1 ] .size ( ) && col[ L- 1 ] [ pointer_col[ L- 1 ] ] .y <= i) {
if ( in( col[ L- 1 ] [ pointer_col[ L- 1 ] ] .x , i, col[ L- 1 ] [ pointer_col[ L- 1 ] ] .y ) ) cc - = dsu.Union ( shape, col[ L- 1 ] [ pointer_col[ L- 1 ] ] .type ) ;
pointer_col[ L- 1 ] ++ ;
}
if ( pointer_col[ L- 1 ] < col[ L- 1 ] .size ( ) && in( col[ L- 1 ] [ pointer_col[ L- 1 ] ] .x , i, col[ L- 1 ] [ pointer_col[ L- 1 ] ] .y ) ) cc - = dsu.Union ( shape, col[ L- 1 ] [ pointer_col[ L- 1 ] ] .type ) ;
while ( pointer_col[ R+ 1 ] < col[ R+ 1 ] .size ( ) && col[ R+ 1 ] [ pointer_col[ R+ 1 ] ] .y <= i) {
if ( in( col[ R+ 1 ] [ pointer_col[ R+ 1 ] ] .x , i, col[ R+ 1 ] [ pointer_col[ R+ 1 ] ] .y ) ) cc - = dsu.Union ( shape, col[ R+ 1 ] [ pointer_col[ R+ 1 ] ] .type ) ;
pointer_col[ R+ 1 ] ++ ;
}
if ( pointer_col[ R+ 1 ] < col[ R+ 1 ] .size ( ) && in( col[ R+ 1 ] [ pointer_col[ R+ 1 ] ] .x , i, col[ R+ 1 ] [ pointer_col[ R+ 1 ] ] .y ) ) cc - = dsu.Union ( shape, col[ R+ 1 ] [ pointer_col[ R+ 1 ] ] .type ) ;
old_shape = shape;
old_r = cur.y ;
}
ans[ i] = cc - ( pre[ n] - pre[ i] ) ;
cout << res[ i] << " " << ans[ i] << endl;
}
return 0 ;
}
/*
4 3 4
1 1 1 2
3 1 3 2
1 3 2 3
4 1 4 3
5 5 7
1 2 1 3
2 1 2 2
1 4 2 4
2 5 3 5
3 3 3 4
4 2 4 3
4 4 4 5
6 3 3
1 1 1 3
2 2 5 2
6 1 6 3
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGVuZGwgJ1xuJwojZGVmaW5lIFBoVHJOZ2hpYSAibWluaG9tZXMiCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IG1heG4gPSAxZTUgKyA1Owpjb25zdCBpbnQgaW5mID0gMWUxODsKCnN0cnVjdCBEU1V7CiAgICBpbnQgbjsKICAgIHZlY3RvciA8aW50PiBwYXJlbnQsIHN6OwogICAgRFNVKGludCBfbil7CiAgICAgICAgbiA9X247CiAgICAgICAgcGFyZW50LmFzc2lnbihuICsgNSwgMCk7CiAgICAgICAgc3ouYXNzaWduKG4gKyA1LCAwKTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgICAgICBwYXJlbnRbaV0gPSBpOwogICAgICAgICAgICBzeltpXSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIGludCBmaW5kX3BhcmVudChpbnQgdSl7CiAgICAgICAgaWYgKHUgPT0gcGFyZW50W3VdKSByZXR1cm4gdTsKICAgICAgICByZXR1cm4gcGFyZW50W3VdID0gZmluZF9wYXJlbnQocGFyZW50W3VdKTsKICAgIH0KCiAgICBib29sIFVuaW9uKGludCB1LCBpbnQgdil7CiAgICAgICAgdSA9IGZpbmRfcGFyZW50KHUpOwogICAgICAgIHYgPSBmaW5kX3BhcmVudCh2KTsKICAgICAgICBpZiAodSA9PSB2KSByZXR1cm4gMDsKICAgICAgICBpZiAoc3pbdV0gPCBzelt2XSkgc3dhcCh1LCB2KTsKICAgICAgICBzelt1XSArPSBzelt2XTsKICAgICAgICBwYXJlbnRbdl0gPSB1OwogICAgICAgIHJldHVybiAxOwogICAgfQp9OwoKc3RydWN0IHBodHJuZ2hpYXsKICAgIGludCB0eXBlLCB4LCB5Owp9OwoKYm9vbCBjbXAocGh0cm5naGlhIHgsIHBodHJuZ2hpYSB5KXsKICAgIHJldHVybiB4LnggPCB5Lng7Cn0KCmJvb2wgaW4oaW50IGwsIGludCBwb3MsIGludCByKXsKICAgIHJldHVybiAobCA8PSBwb3MgJiYgcG9zIDw9IHIpOwp9Cgpib29sIG92ZXJsYXAocGh0cm5naGlhIGEsIHBodHJuZ2hpYSBiKXsKICAgIGJvb2wgYzEgPSAoYS54IDw9IGIueCAmJiBiLnggPD0gYS55KTsKICAgIGJvb2wgYzIgPSAoYS54IDw9IGIueSAmJiBiLnkgPD0gYS55KTsKICAgIGJvb2wgYzMgPSAoYi54IDw9IGEueCAmJiBhLnggPD0gYi55KTsKICAgIGJvb2wgYzQgPSAoYi54IDw9IGEueSAmJiBhLnkgPD0gYi55KTsKICAgIHJldHVybiAoYzEgb3IgYzIgb3IgYzMgb3IgYzQpOwp9CgppbnQgbiwgbSwgcSwgY2M7CmludCBhbnNbbWF4bl0sIHByZVttYXhuXSwgcHJlZlttYXhuXSwgcmVzW21heG5dLCBwb2ludGVyX2NvbFttYXhuXSwgbWFya1ttYXhuXTsKdmVjdG9yIDxwaHRybmdoaWE+IGNsb3NlX2NvbFttYXhuXSwgcm93W21heG5dLCBjb2xbbWF4bl0sIGNvbF9jbG9zZVttYXhuXSwgY29sX29wZW5bbWF4bl07CgpzaWduZWQgbWFpbigpewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIGlmIChmb3BlbihQaFRyTmdoaWEiLklOUCIsICJyIikpewogICAgICAgIGZyZW9wZW4oUGhUck5naGlhIi5JTlAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKFBoVHJOZ2hpYSIuT1VUIiwgInciLCBzdGRvdXQpOwogICAgfQoKICAgIGNpbiA+PiBuID4+IG0gPj4gcTsKICAgIGNjID0gcTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IHE7IGkrKyl7CiAgICAgICAgaW50IHgxLCB5MSwgeDIsIHkyOwogICAgICAgIGNpbiA+PiB4MSA+PiB5MSA+PiB4MiA+PiB5MjsgLy9saW5lCiAgICAgICAgcHJlW3gxXSsrOwogICAgICAgIGlmICh4MSA9PSB4Mil7CiAgICAgICAgICAgIHJvd1t4MV0ucHVzaF9iYWNrKHtpLCB5MSwgeTJ9KTsKICAgICAgICAgICAgcHJlZlt4MV0gKz0gKHkyIC0geTEgKyAxKTsKICAgICAgICAgICAgcHJlZlt4MSsxXSAtPSAoeTIgLSB5MSArIDEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHgxID09IHgyICYmIHkxID09IHkyKSBjb250aW51ZTsKCiAgICAgICAgaWYgKHkxID09IHkyKXsKICAgICAgICAgICAgY29sX29wZW5beDFdLnB1c2hfYmFjayh7aSwgeTEsIHkyfSk7CiAgICAgICAgICAgIGNvbF9jbG9zZVt4MisxXS5wdXNoX2JhY2soe2ksIHkxLCB5Mn0pOwoKICAgICAgICAgICAgY29sW3kxXS5wdXNoX2JhY2soe2ksIHgxLCB4Mn0pOwoKICAgICAgICAgICAgY2xvc2VfY29sW3gyXS5wdXNoX2JhY2soe2ksIHkxLCB5Mn0pOwoKICAgICAgICAgICAgcHJlZlt4MV0rKzsKICAgICAgICAgICAgcHJlZlt4MisxXS0tOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICAgIHByZVtpXSArPSBwcmVbaS0xXTsKICAgICAgICBwcmVmW2ldICs9IHByZWZbaS0xXTsKICAgICAgICByZXNbaV0gPSByZXNbaS0xXSArIHByZWZbaV07CiAgICAgICAgc29ydChyb3dbaV0uYmVnaW4oKSwgcm93W2ldLmVuZCgpLCBjbXApOwogICAgICAgIHNvcnQoY29sX29wZW5baV0uYmVnaW4oKSwgY29sX29wZW5baV0uZW5kKCksIGNtcCk7CiAgICAgICAgc29ydChjbG9zZV9jb2xbaV0uYmVnaW4oKSwgY2xvc2VfY29sW2ldLmVuZCgpLCBjbXApOwogICAgICAgIHNvcnQoY29sW2ldLmJlZ2luKCksIGNvbFtpXS5lbmQoKSwgY21wKTsKICAgIH0KCiAgICBEU1UgZHN1KHEpOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CiAgICAgICAgCiAgICAgICAgaW50IGlkeDMgPSAwLCBpZHg0ID0gMDsKCiAgICAgICAgZm9yIChwaHRybmdoaWEgY3VyOiBjb2xfY2xvc2VbaV0pewogICAgICAgICAgICBpbnQgcG9zID0gY3VyLng7CiAgICAgICAgICAgIG1hcmtbcG9zXSA9IDA7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHBodHJuZ2hpYSBjdXI6IGNvbF9vcGVuW2ldKXsKICAgICAgICAgICAgaW50IHNoYXBlID0gY3VyLnR5cGU7CiAgICAgICAgICAgIGludCBwb3MgPSBjdXIueDsKCiAgICAgICAgICAgIHdoaWxlIChpZHgzIDwgcm93W2ktMV0uc2l6ZSgpICYmIHJvd1tpLTFdW2lkeDNdLnkgPD0gcG9zKXsKICAgICAgICAgICAgICAgIGlmIChpbihyb3dbaS0xXVtpZHgzXS54LCBwb3MsIHJvd1tpLTFdW2lkeDNdLnkpKSBjYyAtPSBkc3UuVW5pb24oc2hhcGUsIHJvd1tpLTFdW2lkeDNdLnR5cGUpOwogICAgICAgICAgICAgICAgaWR4MysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpZHgzIDwgcm93W2ktMV0uc2l6ZSgpICYmIGluKHJvd1tpLTFdW2lkeDNdLngsIHBvcywgcm93W2ktMV1baWR4M10ueSkpIGNjIC09IGRzdS5VbmlvbihzaGFwZSwgcm93W2ktMV1baWR4M10udHlwZSk7CgogICAgICAgICAgICB3aGlsZSAoaWR4NCA8IGNsb3NlX2NvbFtpLTFdLnNpemUoKSAmJiBjbG9zZV9jb2xbaS0xXVtpZHg0XS55IDw9IHBvcyl7CiAgICAgICAgICAgICAgICBpZiAoaW4oY2xvc2VfY29sW2ktMV1baWR4NF0ueCwgcG9zLCBjbG9zZV9jb2xbaS0xXVtpZHg0XS55KSkgY2MgLT0gZHN1LlVuaW9uKHNoYXBlLCBjbG9zZV9jb2xbaS0xXVtpZHg0XS50eXBlKTsKICAgICAgICAgICAgICAgIGlkeDQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaWR4NCA8IGNsb3NlX2NvbFtpLTFdLnNpemUoKSAmJiBpbihjbG9zZV9jb2xbaS0xXVtpZHg0XS54LCBwb3MsIGNsb3NlX2NvbFtpLTFdW2lkeDRdLnkpKSBjYyAtPSBkc3UuVW5pb24oc2hhcGUsIGNsb3NlX2NvbFtpLTFdW2lkeDRdLnR5cGUpOwoKICAgICAgICAgICAgaWYgKG1hcmtbcG9zLTFdKSBjYyAtPSBkc3UuVW5pb24oc2hhcGUsIG1hcmtbcG9zLTFdKTsKICAgICAgICAgICAgaWYgKG1hcmtbcG9zKzFdKSBjYyAtPSBkc3UuVW5pb24oc2hhcGUsIG1hcmtbcG9zKzFdKTsKICAgICAgICAgICAgbWFya1twb3NdID0gc2hhcGU7CiAgICAgICAgfQoKCiAgICAgICAgaW50IG9sZF9zaGFwZSA9IGluZiwgb2xkX3IgPSBpbmYsIGlkeDEgPSAwLCBpZHgyID0gMDsKICAgICAgICBmb3IgKHBodHJuZ2hpYSBjdXI6IHJvd1tpXSl7CiAgICAgICAgICAgIGludCBzaGFwZSA9IGN1ci50eXBlOwogICAgICAgICAgICBpbnQgTCA9IGN1ci54OwogICAgICAgICAgICBpbnQgUiA9IGN1ci55OwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKG9sZF9yKzEgPT0gY3VyLngpIGNjIC09IGRzdS5VbmlvbihzaGFwZSwgb2xkX3NoYXBlKTsKCiAgICAgICAgICAgIHdoaWxlIChpZHgxIDwgcm93W2ktMV0uc2l6ZSgpICYmIHJvd1tpLTFdW2lkeDFdLnkgPD0gY3VyLnkpewogICAgICAgICAgICAgICAgaWYgKG92ZXJsYXAoY3VyLCByb3dbaS0xXVtpZHgxXSkpIGNjIC09IGRzdS5VbmlvbihzaGFwZSwgcm93W2ktMV1baWR4MV0udHlwZSk7CiAgICAgICAgICAgICAgICBpZHgxKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpZHgxIDwgcm93W2ktMV0uc2l6ZSgpICYmIG92ZXJsYXAoY3VyLCByb3dbaS0xXVtpZHgxXSkpIGNjIC09IGRzdS5VbmlvbihzaGFwZSwgcm93W2ktMV1baWR4MV0udHlwZSk7CgogICAgICAgICAgICB3aGlsZSAoaWR4MiA8IGNsb3NlX2NvbFtpLTFdLnNpemUoKSAmJiBjbG9zZV9jb2xbaS0xXVtpZHgyXS55IDw9IGN1ci55KXsKICAgICAgICAgICAgICAgIGlmIChvdmVybGFwKGN1ciwgY2xvc2VfY29sW2ktMV1baWR4Ml0pKSBjYyAtPSBkc3UuVW5pb24oc2hhcGUsIGNsb3NlX2NvbFtpLTFdW2lkeDJdLnR5cGUpOwogICAgICAgICAgICAgICAgaWR4MisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpZHgyIDwgY2xvc2VfY29sW2ktMV0uc2l6ZSgpICYmIG92ZXJsYXAoY3VyLCBjbG9zZV9jb2xbaS0xXVtpZHgyXSkpIGNjIC09IGRzdS5VbmlvbihzaGFwZSwgY2xvc2VfY29sW2ktMV1baWR4Ml0udHlwZSk7CgogICAgICAgICAgICB3aGlsZSAocG9pbnRlcl9jb2xbTC0xXSA8IGNvbFtMLTFdLnNpemUoKSAmJiBjb2xbTC0xXVtwb2ludGVyX2NvbFtMLTFdXS55IDw9IGkpewogICAgICAgICAgICAgICAgaWYgKGluKGNvbFtMLTFdW3BvaW50ZXJfY29sW0wtMV1dLngsIGksIGNvbFtMLTFdW3BvaW50ZXJfY29sW0wtMV1dLnkpKSBjYyAtPSBkc3UuVW5pb24oc2hhcGUsIGNvbFtMLTFdW3BvaW50ZXJfY29sW0wtMV1dLnR5cGUpOwogICAgICAgICAgICAgICAgcG9pbnRlcl9jb2xbTC0xXSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwb2ludGVyX2NvbFtMLTFdIDwgY29sW0wtMV0uc2l6ZSgpICYmIGluKGNvbFtMLTFdW3BvaW50ZXJfY29sW0wtMV1dLngsIGksIGNvbFtMLTFdW3BvaW50ZXJfY29sW0wtMV1dLnkpKSBjYyAtPSBkc3UuVW5pb24oc2hhcGUsIGNvbFtMLTFdW3BvaW50ZXJfY29sW0wtMV1dLnR5cGUpOwoKICAgICAgICAgICAgd2hpbGUgKHBvaW50ZXJfY29sW1IrMV0gPCBjb2xbUisxXS5zaXplKCkgJiYgY29sW1IrMV1bcG9pbnRlcl9jb2xbUisxXV0ueSA8PSBpKXsKICAgICAgICAgICAgICAgIGlmIChpbihjb2xbUisxXVtwb2ludGVyX2NvbFtSKzFdXS54LCBpLCBjb2xbUisxXVtwb2ludGVyX2NvbFtSKzFdXS55KSkgY2MgLT0gZHN1LlVuaW9uKHNoYXBlLCBjb2xbUisxXVtwb2ludGVyX2NvbFtSKzFdXS50eXBlKTsKICAgICAgICAgICAgICAgIHBvaW50ZXJfY29sW1IrMV0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocG9pbnRlcl9jb2xbUisxXSA8IGNvbFtSKzFdLnNpemUoKSAmJiBpbihjb2xbUisxXVtwb2ludGVyX2NvbFtSKzFdXS54LCBpLCBjb2xbUisxXVtwb2ludGVyX2NvbFtSKzFdXS55KSkgY2MgLT0gZHN1LlVuaW9uKHNoYXBlLCBjb2xbUisxXVtwb2ludGVyX2NvbFtSKzFdXS50eXBlKTsKCiAgICAgICAgICAgIG9sZF9zaGFwZSA9IHNoYXBlOwogICAgICAgICAgICBvbGRfciA9IGN1ci55OwogICAgICAgIH0KCiAgICAgICAgYW5zW2ldID0gY2MgLSAocHJlW25dIC0gcHJlW2ldKTsKICAgICAgICBjb3V0IDw8IHJlc1tpXSA8PCAiICIgPDwgYW5zW2ldIDw8IGVuZGw7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KLyoKNCAzIDQKMSAxIDEgMgozIDEgMyAyCjEgMyAyIDMKNCAxIDQgMwoKNSA1IDcKMSAyIDEgMwoyIDEgMiAyCjEgNCAyIDQKMiA1IDMgNQozIDMgMyA0CjQgMiA0IDMKNCA0IDQgNQoKNiAzIDMKMSAxIDEgMwoyIDIgNSAyCjYgMSA2IDMKKi8K