#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll add = 0 ;
bool getArrays( vector< int > & X, vector< int > & P, vector< int > & A, vector< int > & B) {
vector< int > a, b;
int m = P.size ( ) ;
int prev = 0 ;
int fpb = - 1 ;
for ( int i = 0 ; i < m; i++ ) {
for ( int j = prev; j < P[ i] ; j++ ) {
a.push_back ( X[ j] ) ;
}
b.push_back ( X[ P[ i] ] ) ;
prev = P[ i] + 1 ;
}
for ( int i = prev; i < X.size ( ) ; i++ ) {
a.push_back ( X[ i] ) ;
}
int n = a.size ( ) ;
P.clear ( ) ;
int l = 0 , r = m - 1 ;
while ( l < r) {
if ( b[ l] == - b[ r] ) {
l++ ;
r-- ;
} else if ( abs ( b[ l] ) > abs ( b[ r] ) ) {
P.push_back ( b[ l++ ] ) ;
} else if ( abs ( b[ l] ) <= abs ( b[ r] ) ) {
P.push_back ( b[ r-- ] ) ;
}
}
if ( l == r) {
if ( b[ l] ! = 0 ) {
P.push_back ( b[ l] ) ;
}
}
sort( P.begin ( ) , P.end ( ) ) ;
swap( b, P) ;
m = b.size ( ) ;
if ( m > n) {
return 0 ;
}
for ( int i = 0 ; i < m; i++ ) {
if ( b[ i] >= 0 && fpb == - 1 ) {
fpb = i;
}
}
if ( fpb == - 1 ) fpb = b.size ( ) ;
int lb = fpb, rb = b.size ( ) - fpb;
int each = ( n + m) / 2 ;
for ( int i = 0 ; i < each - lb; i++ ) {
if ( a[ i] > 0 ) {
add + = abs ( a[ i] ) ;
a[ i] = 0 ;
}
}
for ( int i = n - 1 ; i >= n - ( each - rb) ; i-- ) {
if ( a[ i] < 0 ) {
add + = abs ( a[ i] ) ;
a[ i] = 0 ;
}
}
int lbound = each - lb;
int rbound = n - ( each - rb) ;
X.clear ( ) ;
P.clear ( ) ;
for ( int i = 0 ; i < lbound; i++ ) {
X.push_back ( abs ( a[ i] ) ) ;
assert ( a[ i] <= 0 ) ;
} for ( int i = rbound; i < n; i++ ) {
P.push_back ( a[ i] ) ;
assert ( a[ i] >= 0 ) ;
} for ( int i = lbound; i < rbound; i++ ) {
add + = abs ( a[ i] ) ;
}
for ( int i = 0 ; i < m; i++ ) {
( b[ i] < 0 ? A : B) .push_back ( abs ( b[ i] ) ) ;
}
reverse( A.begin ( ) , A.end ( ) ) ;
reverse( X.begin ( ) , X.end ( ) ) ;
return 1 ;
}
struct fenwick {
int n;
vector< ll> sum;
fenwick( int N) {
n = N;
sum.assign ( n + 1 , 0 ) ;
}
void update( int i, int v) {
i++ ;
for ( ; i <= n; i + = i & - i)
sum[ i] + = v;
}
ll query( int i) {
ll ans = 0 ;
for ( ; i; i - = i & - i)
ans + = sum[ i] ;
return ans;
}
ll get( int l, int r) {
return query( r + 1 ) - query( l) ;
}
} ;
long long get_cost( vector< int > a, vector< int > b) {
vector< int > A, B;
if ( ! getArrays( a, b, A, B) ) {
return - 1 ;
}
assert ( a.size ( ) - B.size ( ) == b.size ( ) - A.size ( ) ) ;
int off = a.size ( ) - B.size ( ) ;
int n = a.size ( ) , N = A.size ( ) ;
int m = b.size ( ) , M = B.size ( ) ;
int tot = n + N;
fenwick sgA( A.size ( ) + 1 ) , sgB( B.size ( ) + 1 ) , sga( a.size ( ) + 1 ) , sgb( b.size ( ) + 1 ) ;
vector< vector< int >> chA( off + 1 ) , chB( off + 1 ) , cha( off + 1 ) , chb( off + 1 ) ;
for ( int i = 0 ; i < A.size ( ) ; i++ ) {
sgA.update ( i, A[ i] ) ;
int id = lower_bound( b.begin ( ) , b.end ( ) , A[ i] ) - b.begin ( ) ;
int get = max( 0 , id - i) ;
if ( get <= off) {
chA[ get] .push_back ( i) ;
}
} for ( int i = 0 ; i < B.size ( ) ; i++ ) {
sgB.update ( i, B[ i] ) ;
int id = lower_bound( a.begin ( ) , a.end ( ) , B[ i] ) - a.begin ( ) ;
int get = max( 0 , id - i) ;
if ( get <= off) {
chB[ get] .push_back ( i) ;
}
} for ( int i = 0 ; i < a.size ( ) ; i++ ) {
sga.update ( i, - a[ i] ) ;
int id = upper_bound( B.begin ( ) , B.end ( ) , a[ i] ) - B.begin ( ) - 1 ;
int get = max( 0 , i - id) ;
if ( get <= off) {
cha[ get] .push_back ( i) ;
}
} for ( int i = 0 ; i < b.size ( ) ; i++ ) {
sgb.update ( i, - b[ i] ) ;
int id = upper_bound( A.begin ( ) , A.end ( ) , b[ i] ) - A.begin ( ) - 1 ;
int get = max( 0 , i - id) ;
if ( get <= off) {
chb[ get] .push_back ( i) ;
}
}
vector< array< int , 2 >> Am( tot + 1 ) , Bm( tot + 1 ) ;
Am[ 0 ] = Bm[ 0 ] = { - 1 , - 1 } ;
for ( int i = 0 ; i < m; i++ )
Bm[ i + 1 ] = { b[ i] , i} ;
for ( int i = 0 ; i < M; i++ )
Bm[ i + m + 1 ] = { B[ i] , i + m} ;
for ( int i = 0 ; i < n; i++ )
Am[ i + 1 ] = { a[ i] , i} ;
for ( int i = 0 ; i < N; i++ )
Am[ i + n + 1 ] = { A[ i] , i + n} ;
sort( Am.begin ( ) , Am.end ( ) ) ;
sort( Bm.begin ( ) , Bm.end ( ) ) ;
vector< vector< int >> places( off + 1 ) , getNxt( off + 1 ) ;
places[ off] .push_back ( 0 ) ;
vector< array< int , 4 >> counts( tot + 1 ) ; // {a, A, b, B}
vector< int > need( tot + 1 ) ;
need[ 0 ] = off;
for ( int i = 1 ; i <= tot; i++ ) {
counts[ i] = counts[ i - 1 ] ;
need[ i] = need[ i - 1 ] ;
bool s = Am[ i] [ 1 ] >= n;
bool k = Bm[ i] [ 1 ] >= m;
counts[ i] [ s] ++ ;
counts[ i] [ k + 2 ] ++ ;
bool ok = false ;
if ( s == k) {
if ( s) {
need[ i] ++ ;
} else if ( ! s) {
need[ i] -- ;
ok = true ;
}
}
if ( need[ i] <= off && need[ i] >= 0 ) {
if ( ok) getNxt[ need[ i] ] .push_back ( i) ;
places[ need[ i] ] .push_back ( i) ;
}
}
assert ( need[ tot] == 0 ) ;
vector< ll> dp( tot + 1 , 1e18 ) ;
auto getCost = [ & ] ( array< int , 4 > & x, array< int , 4 > & y) { // {a, A, b, B}
ll ret = 0 ;
if ( x[ 0 ] ! = y[ 0 ] )
ret + = sga.get ( x[ 0 ] , y[ 0 ] - 1 ) + sgB.get ( x[ 3 ] , y[ 3 ] - 1 ) ;
if ( x[ 2 ] ! = y[ 2 ] )
ret + = sgA.get ( x[ 1 ] , y[ 1 ] - 1 ) + sgb.get ( x[ 2 ] , y[ 2 ] - 1 ) ;
return ret;
} ;
dp[ 0 ] = 0 ;
int cnt = 0 ;
for ( int i = off; i >= 0 ; i-- ) {
for ( int & x : chA[ cnt] ) {
sgA.update ( x, - 2 * A[ x] ) ;
} for ( int & x : chB[ cnt] ) {
sgB.update ( x, - 2 * B[ x] ) ;
} for ( int & x : cha[ cnt] ) {
sga.update ( x, 2 * a[ x] ) ;
} for ( int & x : chb[ cnt] ) {
sgb.update ( x, 2 * b[ x] ) ;
}
for ( int j = 0 ; j < places[ i] .size ( ) ; j++ ) {
int x = places[ i] [ j] ;
if ( j + 1 ! = places[ i] .size ( ) ) {
int nxt = places[ i] [ j + 1 ] ;
dp[ nxt] = min( dp[ nxt] , dp[ x] + getCost( counts[ x] , counts[ nxt] ) ) ;
}
if ( i) {
int id = upper_bound( getNxt[ i - 1 ] .begin ( ) , getNxt[ i - 1 ] .end ( ) , x) - getNxt[ i - 1 ] .begin ( ) ;
if ( id ! = getNxt[ i - 1 ] .size ( ) ) {
int nxt = getNxt[ i - 1 ] [ id] ;
dp[ nxt] = min( dp[ nxt] , dp[ x] + getCost( counts[ x] , counts[ nxt - 1 ] ) +
abs ( Am[ nxt] [ 0 ] - Bm[ nxt] [ 0 ] ) ) ;
}
}
}
cnt++ ;
}
return add + dp[ tot] ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCgpsbCBhZGQgPSAwOwoKYm9vbCBnZXRBcnJheXModmVjdG9yPGludD4gJlgsIHZlY3RvcjxpbnQ+ICZQLCB2ZWN0b3I8aW50PiAmQSwgdmVjdG9yPGludD4gJkIpIHsKICAgIHZlY3RvcjxpbnQ+IGEsIGI7CiAgICBpbnQgbSA9IFAuc2l6ZSgpOwogICAgaW50IHByZXYgPSAwOwogICAgaW50IGZwYiA9IC0xOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gcHJldjsgaiA8IFBbaV07IGorKykgewogICAgICAgICAgICBhLnB1c2hfYmFjayhYW2pdKTsKICAgICAgICB9CiAgICAgICAgYi5wdXNoX2JhY2soWFtQW2ldXSk7CiAgICAgICAgcHJldiA9IFBbaV0gKyAxOwogICAgfQogICAgZm9yIChpbnQgaSA9IHByZXY7IGkgPCBYLnNpemUoKTsgaSsrKSB7CiAgICAgICAgYS5wdXNoX2JhY2soWFtpXSk7CiAgICB9CiAgICAKICAgIGludCBuID0gYS5zaXplKCk7CiAgICBQLmNsZWFyKCk7CiAgICBpbnQgbCA9IDAsIHIgPSBtIC0gMTsKICAgIHdoaWxlIChsIDwgcikgewogICAgICAgIGlmIChiW2xdID09IC1iW3JdKSB7CiAgICAgICAgICAgIGwrKzsKICAgICAgICAgICAgci0tOwogICAgICAgIH0gZWxzZSBpZiAoYWJzKGJbbF0pID4gYWJzKGJbcl0pKSB7CiAgICAgICAgICAgIFAucHVzaF9iYWNrKGJbbCsrXSk7CiAgICAgICAgfSBlbHNlIGlmIChhYnMoYltsXSkgPD0gYWJzKGJbcl0pKSB7CiAgICAgICAgICAgIFAucHVzaF9iYWNrKGJbci0tXSk7CiAgICAgICAgfQogICAgfQogICAgaWYgKGwgPT0gcikgewogICAgICAgIGlmIChiW2xdICE9IDApIHsKICAgICAgICAgICAgUC5wdXNoX2JhY2soYltsXSk7CiAgICAgICAgfQogICAgfQogICAgc29ydChQLmJlZ2luKCksIFAuZW5kKCkpOwogICAgc3dhcChiLCBQKTsKCiAgICBtID0gYi5zaXplKCk7CiAgICBpZiAobSA+IG4pIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgIGlmIChiW2ldID49IDAgJiYgZnBiID09IC0xKSB7CiAgICAgICAgICAgIGZwYiA9IGk7CiAgICAgICAgfQogICAgfQogICAgaWYgKGZwYiA9PSAtMSkgZnBiID0gYi5zaXplKCk7CgogICAgaW50IGxiID0gZnBiLCByYiA9IGIuc2l6ZSgpIC0gZnBiOwogICAgaW50IGVhY2ggPSAobiArIG0pIC8gMjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWFjaCAtIGxiOyBpKyspIHsKICAgICAgICBpZiAoYVtpXSA+IDApIHsKICAgICAgICAgICAgYWRkICs9IGFicyhhW2ldKTsKICAgICAgICAgICAgYVtpXSA9IDA7CiAgICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IG4gLSAxOyBpID49IG4gLSAoZWFjaCAtIHJiKTsgaS0tKSB7CiAgICAgICAgaWYgKGFbaV0gPCAwKSB7CiAgICAgICAgICAgIGFkZCArPSBhYnMoYVtpXSk7CiAgICAgICAgICAgIGFbaV0gPSAwOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgbGJvdW5kID0gZWFjaCAtIGxiOwogICAgaW50IHJib3VuZCA9IG4gLSAoZWFjaCAtIHJiKTsKICAgIFguY2xlYXIoKTsKICAgIFAuY2xlYXIoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGJvdW5kOyBpKyspIHsKICAgICAgICBYLnB1c2hfYmFjayhhYnMoYVtpXSkpOwogICAgICAgIGFzc2VydChhW2ldIDw9IDApOwogICAgfSBmb3IgKGludCBpID0gcmJvdW5kOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgUC5wdXNoX2JhY2soYVtpXSk7CiAgICAgICAgYXNzZXJ0KGFbaV0gPj0gMCk7CiAgICB9IGZvciAoaW50IGkgPSBsYm91bmQ7IGkgPCByYm91bmQ7IGkrKykgewogICAgICAgIGFkZCArPSBhYnMoYVtpXSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgIChiW2ldIDwgMCA/IEEgOiBCKS5wdXNoX2JhY2soYWJzKGJbaV0pKTsKICAgIH0KCiAgICByZXZlcnNlKEEuYmVnaW4oKSwgQS5lbmQoKSk7CiAgICByZXZlcnNlKFguYmVnaW4oKSwgWC5lbmQoKSk7CiAgICByZXR1cm4gMTsKfQoKc3RydWN0IGZlbndpY2sgewogICAgaW50IG47CiAgICB2ZWN0b3I8bGw+IHN1bTsKICAgIGZlbndpY2soaW50IE4pIHsKICAgICAgICBuID0gTjsKICAgICAgICBzdW0uYXNzaWduKG4gKyAxLCAwKTsKICAgIH0KCiAgICB2b2lkIHVwZGF0ZShpbnQgaSwgaW50IHYpIHsKICAgICAgICBpKys7CiAgICAgICAgZm9yICg7IGkgPD0gbjsgaSArPSBpICYgLWkpIAogICAgICAgICAgICBzdW1baV0gKz0gdjsKICAgIH0KCiAgICBsbCBxdWVyeShpbnQgaSkgewogICAgICAgIGxsIGFucyA9IDA7CiAgICAgICAgZm9yICg7IGk7IGkgLT0gaSAmIC1pKSAKICAgICAgICAgICAgYW5zICs9IHN1bVtpXTsKICAgICAgICByZXR1cm4gYW5zOwogICAgfQoKICAgIGxsIGdldChpbnQgbCwgaW50IHIpIHsKICAgICAgICByZXR1cm4gcXVlcnkociArIDEpIC0gcXVlcnkobCk7CiAgICB9Cn07Cgpsb25nIGxvbmcgZ2V0X2Nvc3QodmVjdG9yPGludD4gYSwgdmVjdG9yPGludD4gYikgewogICAgdmVjdG9yPGludD4gQSwgQjsKICAgIGlmICghZ2V0QXJyYXlzKGEsIGIsIEEsIEIpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgYXNzZXJ0KGEuc2l6ZSgpIC0gQi5zaXplKCkgPT0gYi5zaXplKCkgLSBBLnNpemUoKSk7CiAgICBpbnQgb2ZmID0gYS5zaXplKCkgLSBCLnNpemUoKTsKICAgIAogICAgaW50IG4gPSBhLnNpemUoKSwgTiA9IEEuc2l6ZSgpOwogICAgaW50IG0gPSBiLnNpemUoKSwgTSA9IEIuc2l6ZSgpOwogICAgaW50IHRvdCA9IG4gKyBOOwogICAgCiAgICBmZW53aWNrIHNnQShBLnNpemUoKSArIDEpLCBzZ0IoQi5zaXplKCkgKyAxKSwgc2dhKGEuc2l6ZSgpICsgMSksIHNnYihiLnNpemUoKSArIDEpOwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBjaEEob2ZmICsgMSksIGNoQihvZmYgKyAxKSwgY2hhKG9mZiArIDEpLCBjaGIob2ZmICsgMSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IEEuc2l6ZSgpOyBpKyspIHsKICAgICAgICBzZ0EudXBkYXRlKGksIEFbaV0pOwogICAgICAgIGludCBpZCA9IGxvd2VyX2JvdW5kKGIuYmVnaW4oKSwgYi5lbmQoKSwgQVtpXSkgLSBiLmJlZ2luKCk7CiAgICAgICAgaW50IGdldCA9IG1heCgwLCBpZCAtIGkpOwogICAgICAgIGlmIChnZXQgPD0gb2ZmKSB7CiAgICAgICAgICAgIGNoQVtnZXRdLnB1c2hfYmFjayhpKTsKICAgICAgICB9CiAgICB9IGZvciAoaW50IGkgPSAwOyBpIDwgQi5zaXplKCk7IGkrKykgewogICAgICAgIHNnQi51cGRhdGUoaSwgQltpXSk7CiAgICAgICAgaW50IGlkID0gbG93ZXJfYm91bmQoYS5iZWdpbigpLCBhLmVuZCgpLCBCW2ldKSAtIGEuYmVnaW4oKTsKICAgICAgICBpbnQgZ2V0ID0gbWF4KDAsIGlkIC0gaSk7CiAgICAgICAgaWYgKGdldCA8PSBvZmYpIHsKICAgICAgICAgICAgY2hCW2dldF0ucHVzaF9iYWNrKGkpOwogICAgICAgIH0KICAgIH0gZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7CiAgICAgICAgc2dhLnVwZGF0ZShpLCAtYVtpXSk7CiAgICAgICAgaW50IGlkID0gdXBwZXJfYm91bmQoQi5iZWdpbigpLCBCLmVuZCgpLCBhW2ldKSAtIEIuYmVnaW4oKSAtIDE7CiAgICAgICAgaW50IGdldCA9IG1heCgwLCBpIC0gaWQpOwogICAgICAgIGlmIChnZXQgPD0gb2ZmKSB7CiAgICAgICAgICAgIGNoYVtnZXRdLnB1c2hfYmFjayhpKTsKICAgICAgICB9CiAgICB9IGZvciAoaW50IGkgPSAwOyBpIDwgYi5zaXplKCk7IGkrKykgewogICAgICAgIHNnYi51cGRhdGUoaSwgLWJbaV0pOwogICAgICAgIGludCBpZCA9IHVwcGVyX2JvdW5kKEEuYmVnaW4oKSwgQS5lbmQoKSwgYltpXSkgLSBBLmJlZ2luKCkgLSAxOwogICAgICAgIGludCBnZXQgPSBtYXgoMCwgaSAtIGlkKTsKICAgICAgICBpZiAoZ2V0IDw9IG9mZikgewogICAgICAgICAgICBjaGJbZ2V0XS5wdXNoX2JhY2soaSk7CiAgICAgICAgfQogICAgfQoKICAgIHZlY3RvcjxhcnJheTxpbnQsIDI+PiBBbSh0b3QgKyAxKSwgQm0odG90ICsgMSk7CiAgICBBbVswXSA9IEJtWzBdID0gey0xLCAtMX07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgCiAgICAgICAgQm1baSArIDFdID0ge2JbaV0sIGl9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNOyBpKyspIAogICAgICAgIEJtW2kgKyBtICsgMV0gPSB7QltpXSwgaSArIG19OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIAogICAgICAgIEFtW2kgKyAxXSA9IHthW2ldLCBpfTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSAKICAgICAgICBBbVtpICsgbiArIDFdID0ge0FbaV0sIGkgKyBufTsKICAgIHNvcnQoQW0uYmVnaW4oKSwgQW0uZW5kKCkpOwogICAgc29ydChCbS5iZWdpbigpLCBCbS5lbmQoKSk7CgogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBwbGFjZXMob2ZmICsgMSksIGdldE54dChvZmYgKyAxKTsKICAgIHBsYWNlc1tvZmZdLnB1c2hfYmFjaygwKTsKICAgIHZlY3RvcjxhcnJheTxpbnQsIDQ+PiBjb3VudHModG90ICsgMSk7IC8vIHthLCBBLCBiLCBCfQogICAgdmVjdG9yPGludD4gbmVlZCh0b3QgKyAxKTsKICAgIG5lZWRbMF0gPSBvZmY7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSB0b3Q7IGkrKykgewogICAgICAgIGNvdW50c1tpXSA9IGNvdW50c1tpIC0gMV07CiAgICAgICAgbmVlZFtpXSA9IG5lZWRbaSAtIDFdOwoKICAgICAgICBib29sIHMgPSBBbVtpXVsxXSA+PSBuOwogICAgICAgIGJvb2wgayA9IEJtW2ldWzFdID49IG07CiAgICAgICAgY291bnRzW2ldW3NdKys7CiAgICAgICAgY291bnRzW2ldW2sgKyAyXSsrOwogICAgICAgIAogICAgICAgIGJvb2wgb2sgPSBmYWxzZTsKICAgICAgICBpZiAocyA9PSBrKSB7CiAgICAgICAgICAgIGlmIChzKSB7CiAgICAgICAgICAgICAgICBuZWVkW2ldKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXMpIHsKICAgICAgICAgICAgICAgIG5lZWRbaV0tLTsKICAgICAgICAgICAgICAgIG9rID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobmVlZFtpXSA8PSBvZmYgJiYgbmVlZFtpXSA+PSAwKSB7CiAgICAgICAgICAgIGlmIChvaykgZ2V0Tnh0W25lZWRbaV1dLnB1c2hfYmFjayhpKTsKICAgICAgICAgICAgcGxhY2VzW25lZWRbaV1dLnB1c2hfYmFjayhpKTsKICAgICAgICB9CiAgICB9CgogICAgYXNzZXJ0KG5lZWRbdG90XSA9PSAwKTsKCiAgICB2ZWN0b3I8bGw+IGRwKHRvdCArIDEsIDFlMTgpOwogICAgYXV0byBnZXRDb3N0ID0gWyZdKGFycmF5PGludCwgND4gJngsIGFycmF5PGludCwgND4gJnkpIHsgLy8ge2EsIEEsIGIsIEJ9CiAgICAgICAgbGwgcmV0ID0gMDsKICAgICAgICBpZiAoeFswXSAhPSB5WzBdKSAKICAgICAgICAgICAgcmV0ICs9IHNnYS5nZXQoeFswXSwgeVswXSAtIDEpICsgc2dCLmdldCh4WzNdLCB5WzNdIC0gMSk7CiAgICAgICAgaWYgKHhbMl0gIT0geVsyXSkgCiAgICAgICAgICAgIHJldCArPSBzZ0EuZ2V0KHhbMV0sIHlbMV0gLSAxKSArIHNnYi5nZXQoeFsyXSwgeVsyXSAtIDEpOwogICAgICAgIHJldHVybiByZXQ7CiAgICB9OwogICAgZHBbMF0gPSAwOwogICAgaW50IGNudCA9IDA7CiAgICBmb3IgKGludCBpID0gb2ZmOyBpID49IDA7IGktLSkgewogICAgICAgIGZvciAoaW50ICZ4IDogY2hBW2NudF0pIHsKICAgICAgICAgICAgc2dBLnVwZGF0ZSh4LCAtMiAqIEFbeF0pOwogICAgICAgIH0gZm9yIChpbnQgJnggOiBjaEJbY250XSkgewogICAgICAgICAgICBzZ0IudXBkYXRlKHgsIC0yICogQlt4XSk7CiAgICAgICAgfSBmb3IgKGludCAmeCA6IGNoYVtjbnRdKSB7CiAgICAgICAgICAgIHNnYS51cGRhdGUoeCwgMiAqIGFbeF0pOwogICAgICAgIH0gZm9yIChpbnQgJnggOiBjaGJbY250XSkgewogICAgICAgICAgICBzZ2IudXBkYXRlKHgsIDIgKiBiW3hdKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwbGFjZXNbaV0uc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgaW50IHggPSBwbGFjZXNbaV1bal07CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoaiArIDEgIT0gcGxhY2VzW2ldLnNpemUoKSkgewogICAgICAgICAgICAgICAgaW50IG54dCA9IHBsYWNlc1tpXVtqICsgMV07CiAgICAgICAgICAgICAgICBkcFtueHRdID0gbWluKGRwW254dF0sIGRwW3hdICsgZ2V0Q29zdChjb3VudHNbeF0sIGNvdW50c1tueHRdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgIGludCBpZCA9IHVwcGVyX2JvdW5kKGdldE54dFtpIC0gMV0uYmVnaW4oKSwgZ2V0Tnh0W2kgLSAxXS5lbmQoKSwgeCkgLSBnZXROeHRbaSAtIDFdLmJlZ2luKCk7CiAgICAgICAgICAgICAgICBpZiAoaWQgIT0gZ2V0Tnh0W2kgLSAxXS5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICBpbnQgbnh0ID0gZ2V0Tnh0W2kgLSAxXVtpZF07CiAgICAgICAgICAgICAgICAgICAgZHBbbnh0XSA9IG1pbihkcFtueHRdLCBkcFt4XSArIGdldENvc3QoY291bnRzW3hdLCBjb3VudHNbbnh0IC0gMV0pICsgCiAgICAgICAgICAgICAgICAgICAgYWJzKEFtW254dF1bMF0gLSBCbVtueHRdWzBdKSk7CiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNudCsrOwogICAgfQoKICAgIHJldHVybiBhZGQgKyBkcFt0b3RdOwp9Cg==