#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
template < class T> struct cLtraits_identity{
using type = T;
}
;
template < class T> using cLtraits_try_make_signed =
typename conditional<
is_integral< T> :: value ,
make_signed< T> ,
cLtraits_identity< T>
> :: type ;
template < class T> using cLtraits_try_make_unsigned =
typename conditional<
is_integral< T> :: value ,
make_unsigned< T> ,
cLtraits_identity< T>
> :: type ;
template < class S, class T> struct cLtraits_common_type{
using tS = typename cLtraits_try_make_signed< S> :: type ;
using tT = typename cLtraits_try_make_signed< T> :: type ;
using type = typename common_type< tS,tT> :: type ;
}
;
void * wmem;
char memarr[ 96000000 ] ;
template < class S, class T> inline auto max_L( S a, T b)
- > typename cLtraits_common_type< S,T> :: type {
return ( typename cLtraits_common_type< S,T> :: type ) a >= ( typename cLtraits_common_type< S,T> :: type ) b ? a : b;
}
template < class S, class T> inline S chmin( S & a, T b) {
if ( a> b) {
a= b;
}
return a;
}
template < class S, class T> inline S chmax( S & a, T b) {
if ( a< b) {
a= b;
}
return a;
}
template < class S, class T> inline S divup_L( S a, T b) {
return ( a+ b- 1 ) / b;
}
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> inline void walloc1d( T ** arr, int x1, int x2, void ** mem = & wmem) {
walloc1d( arr, x2- x1, mem) ;
( * arr) - = x1;
}
inline int Ilog2_f_L( const int n) {
int res;
if ( n <= 0 ) {
return - 1 ;
}
res = sizeof ( int ) * 8 - __builtin_clz( n) - 1 ;
return res;
}
inline int Ilog2_f_L( const long long n) {
int res;
if ( n <= 0 ) {
return - 1 ;
}
res = sizeof ( long long ) * 8 - __builtin_clzll( n) - 1 ;
return res;
}
template < class T1> void sortI( int N, T1 a[ ] , void * mem = wmem) {
sort( a, a+ N) ;
}
template < class T1, class T2> void sortI( int N, T1 a[ ] , T2 b[ ] , void * mem = wmem) {
int i;
pair< T1, T2> * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first = a[ i] ;
arr[ i] .second = b[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first ;
b[ i] = arr[ i] .second ;
}
}
template < class T1, class T2, class T3> void sortI( int N, T1 a[ ] , T2 b[ ] , T3 c[ ] , void * mem = wmem) {
int i;
pair< T1, pair< T2, T3> > * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first = a[ i] ;
arr[ i] .second .first = b[ i] ;
arr[ i] .second .second = c[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first ;
b[ i] = arr[ i] .second .first ;
c[ i] = arr[ i] .second .second ;
}
}
template < class T1, class T2, class T3, class T4> void sortI( int N, T1 a[ ] , T2 b[ ] , T3 c[ ] , T4 d[ ] , void * mem = wmem) {
int i;
pair< pair< T1, T2> , pair< T3, T4> > * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first .first = a[ i] ;
arr[ i] .first .second = b[ i] ;
arr[ i] .second .first = c[ i] ;
arr[ i] .second .second = d[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first .first ;
b[ i] = arr[ i] .first .second ;
c[ i] = arr[ i] .second .first ;
d[ i] = arr[ i] .second .second ;
}
}
template < class T> inline int sort_helper_getbit( T A[ ] ) {
return - 1 ;
}
template <> inline int sort_helper_getbit( int A[ ] ) {
return sizeof ( int ) * 8 ;
}
template <> inline int sort_helper_getbit( unsigned A[ ] ) {
return sizeof ( unsigned ) * 8 ;
}
template <> inline int sort_helper_getbit( long long A[ ] ) {
return sizeof ( long long ) * 8 ;
}
template <> inline int sort_helper_getbit( unsigned long long A[ ] ) {
return sizeof ( unsigned long long ) * 8 ;
}
template <> inline int sort_helper_getbit( char A[ ] ) {
return sizeof ( char ) * 8 ;
}
template < class T> void sortA_1_int_L( int N, T A[ ] , void * mem = wmem) {
int i;
int j;
int k;
int b;
int s;
int ok;
ok = 1 ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
if ( A[ i- 1 ] > A[ i] ) {
ok = 0 ;
break ;
}
}
if ( ok) {
return ;
}
if ( N < 128 ) {
sort( A,A+ N) ;
return ;
}
b = sort_helper_getbit( A) ;
if ( b== - 1 ) {
sort( A,A+ N) ;
return ;
}
T mn;
T mx;
mn = mx = A[ 0 ] ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
chmin( mn, A[ i] ) ;
}
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
chmax( mx, A[ i] ) ;
}
ok = 1 ;
if ( mn < 0 && mx > 0 && ( mn < - N || mx > N) ) {
ok = 0 ;
}
if ( ok && mx - mn > N) {
ok = 0 ;
}
if ( ok) {
int * tmp;
walloc1d( & tmp, mx- mn+ 1 , & mem) ;
for ( i= ( 0 ) ; i< ( mx- mn+ 1 ) ; i++ ) {
tmp[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
tmp[ A[ i] - mn] ++ ;
}
k = 0 ;
for ( i= ( 0 ) ; i< ( mx- mn+ 1 ) ; i++ ) {
while ( tmp[ i] > 0 ) {
tmp[ i] -- ;
A[ k++ ] = i+ mn;
}
}
return ;
}
{
typename make_unsigned< T> :: type * t[ 2 ] ;
typename make_unsigned< T> :: type mask;
typename make_unsigned< T> :: type cur;
typename make_unsigned< T> :: type one = 1 ;
T tone = 1 ;
int * pos;
int nn = 0 ;
int ss;
s = Ilog2_f_L( N) ;
if ( s > 8 ) {
s = ( 8 + ( s- 7 ) / 2 ) ;
}
ss = 1 ;
for ( ;; ) {
if ( ss >= b) {
break ;
}
if ( mx >= 0 && ( tone << ( ss- 1 ) ) < mx ) {
ss++ ;
continue ;
}
if ( mn < 0 && - ( tone << ( ss- 1 ) ) >= mn ) {
ss++ ;
continue ;
}
break ;
}
k = ( divup_L( ss,s) ) ;
s = ( divup_L( ss,k) ) ;
mask = 0 ;
for ( i= ( 0 ) ; i< ( b) ; i++ ) {
if ( i < s* k) {
mask | = one << i;
}
}
t[ 0 ] = ( typename make_unsigned< T> :: type * ) A;
walloc1d( & t[ 1 ] , N, & mem) ;
walloc1d( & pos, ( 1 << s) + 1 , & mem) ;
for ( j= ( 0 ) ; j< ( k) ; j++ ) {
cur = 0 ;
for ( i= ( 0 ) ; i< ( b) ; i++ ) {
if ( s* j <= i && i < s* ( j+ 1 ) && i < b) {
cur | = one << i;
}
}
for ( i= ( 0 ) ; i< ( ( 1 << s) + 1 ) ; i++ ) {
pos[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
pos[ ( ( t[ nn] [ i] & cur) >> ( s* j) ) + 1 ] ++ ;
}
for ( i= ( 0 ) ; i< ( ( 1 << s) ) ; i++ ) {
pos[ i+ 1 ] + = pos[ i] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
t[ nn^ 1 ] [ pos[ ( t[ nn] [ i] & cur) >> ( s* j) ] ++ ] = t[ nn] [ i] ;
}
nn ^ = 1 ;
mask ^ = cur;
}
if ( mn < 0 && mx >= 0 ) {
k = 0 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( A[ i] < 0 ) {
k++ ;
}
}
for ( i= ( 0 ) ; i< ( k) ; i++ ) {
t[ nn^ 1 ] [ i] = t[ nn] [ N- k+ i] ;
}
for ( i= ( k) ; i< ( N) ; i++ ) {
t[ nn^ 1 ] [ i] = t[ nn] [ i- k] ;
}
nn ^ = 1 ;
}
if ( nn== 1 ) {
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
t[ 0 ] [ i] = t[ 1 ] [ i] ;
}
}
return ;
}
sort( A, A+ N) ;
}
template < class T> void sortA_1_nonint_L( int N, T A[ ] , void * mem = wmem) {
sort( A,A+ N) ;
}
template < class T> void sortA_1_call_L( int N, T A[ ] , void * mem = wmem) {
sortA_1_nonint_L( N, A, mem) ;
}
template <> void sortA_1_call_L( int N, int A[ ] , void * mem) {
sortA_1_int_L( N, A, mem) ;
}
template <> void sortA_1_call_L( int N, unsigned A[ ] , void * mem) {
sortA_1_int_L( N, A, mem) ;
}
template <> void sortA_1_call_L( int N, long long A[ ] , void * mem) {
sortA_1_int_L( N, A, mem) ;
}
template <> void sortA_1_call_L( int N, unsigned long long A[ ] , void * mem) {
sortA_1_int_L( N, A, mem) ;
}
template <> void sortA_1_call_L( int N, char A[ ] , void * mem) {
sortA_1_int_L( N, A, mem) ;
}
template < class T1> void sortA( int N, T1 a[ ] , void * mem = wmem) {
sortA_1_call_L( N, a, mem) ;
}
template < class T1, class T2> void sortA_2_int_L( int N, T1 A[ ] , T2 B[ ] , void * mem = wmem) {
int i;
int b_a;
int b_b;
int s1;
int s2;
int so2;
T1 mn1;
T1 mx1;
T2 mn2;
T2 mx2;
typename cLtraits_try_make_unsigned< T1> :: type r1;
typename cLtraits_try_make_unsigned< T2> :: type r2;
so2 = 1 ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
if ( A[ i- 1 ] > A[ i] || ( A[ i- 1 ] == A[ i] && B[ i- 1 ] > B[ i] ) ) {
so2 = 0 ;
break ;
}
}
if ( so2) {
return ;
}
so2 = 1 ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
if ( A[ i- 1 ] > A[ i] ) {
so2 = 0 ;
break ;
}
}
if ( so2== 1 ) {
int k = 0 ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
if ( A[ i] ! = A[ i- 1 ] ) {
sortA_1_call_L( i- k, B+ k, mem) ;
k = i;
}
}
sortA_1_call_L( N- k, B+ k, mem) ;
return ;
}
if ( N < 128 ) {
sortI( N,A,B,mem) ;
return ;
}
b_a = sort_helper_getbit( A) ;
b_b = sort_helper_getbit( B) ;
if ( b_a == - 1 || b_b == - 1 ) {
sortI( N,A,B,mem) ;
return ;
}
mn1 = mx1 = A[ 0 ] ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
chmin( mn1, A[ i] ) ;
}
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
chmax( mx1, A[ i] ) ;
}
mn2 = mx2 = B[ 0 ] ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
chmin( mn2, B[ i] ) ;
}
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
chmax( mx2, B[ i] ) ;
}
if ( mn1 < - 4611686016279904256LL || mn2 < - 4611686016279904256LL || mx1 > 4611686016279904256LL || mx2 > 4611686016279904256LL || mx1- mn1 > 4611686016279904256LL || mx2- mn2 > 4611686016279904256LL) {
sortI( N,A,B,mem) ;
return ;
}
r1 = ( typename cLtraits_try_make_unsigned< T1> :: type ) ( mx1) - ( typename cLtraits_try_make_unsigned< T1> :: type ) ( mn1) ;
r2 = ( typename cLtraits_try_make_unsigned< T2> :: type ) ( mx2) - ( typename cLtraits_try_make_unsigned< T2> :: type ) ( mn2) ;
if ( r1 == 0 ) {
sortA_1_call_L( N, B, mem) ;
return ;
}
if ( r2 == 0 ) {
sortA_1_call_L( N, A, mem) ;
return ;
}
if ( r1 <= N) {
so2 = 1 ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
if ( B[ i- 1 ] > B[ i] ) {
so2 = 0 ;
break ;
}
}
if ( so2 == 1 ) {
T1* aa;
T2* bb;
int * pos;
int k;
walloc1d( & aa,N,& mem) ;
walloc1d( & bb,N,& mem) ;
walloc1d( & pos,r1+ 2 ,& mem) ;
for ( i= ( 0 ) ; i< ( r1+ 2 ) ; i++ ) {
pos[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
aa[ i] = A[ i] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
bb[ i] = B[ i] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
pos[ ( typename cLtraits_try_make_unsigned< T1> :: type ) ( ( typename cLtraits_try_make_unsigned< T1> :: type ) aa[ i] - ( typename cLtraits_try_make_unsigned< T1> :: type ) mn1) + 1 ] ++ ;
}
for ( i= ( 1 ) ; i< ( r1+ 2 ) ; i++ ) {
pos[ i] + = pos[ i- 1 ] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
k = pos[ ( typename cLtraits_try_make_unsigned< T1> :: type ) ( ( typename cLtraits_try_make_unsigned< T1> :: type ) aa[ i] - ( typename cLtraits_try_make_unsigned< T1> :: type ) mn1) + 0 ] ++ ;
A[ k] = aa[ i] ;
B[ k] = bb[ i] ;
}
return ;
}
}
s1 = s2 = 1 ;
while ( s1 < 64 && r1 >= ( 1ULL<< s1) ) {
s1++ ;
}
while ( s2 < 64 && r2 >= ( 1ULL<< s2) ) {
s2++ ;
}
if ( s1 + s2 <= 32 ) {
unsigned * tmp;
walloc1d( & tmp,N,& mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
tmp[ i] = ( ( ( unsigned ) ( ( int ) A[ i] - ( int ) mn1) ) << s2) | ( ( unsigned ) ( ( int ) B[ i] - ( int ) mn2) ) ;
}
sortA_1_call_L( N, tmp, mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
A[ i] = ( ( int ) ( tmp[ i] >> s2) ) + ( ( int ) mn1) ;
B[ i] = ( ( int ) ( tmp[ i] & ( ( 1U<< s2) - 1 ) ) ) + ( ( int ) mn2) ;
}
return ;
}
if ( s1 + s2 <= 64 ) {
unsigned long long * tmp;
walloc1d( & tmp,N,& mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
tmp[ i] = ( ( ( unsigned long long ) ( ( long long ) A[ i] - ( long long ) mn1) ) << s2) | ( ( unsigned long long ) ( ( long long ) B[ i] - ( long long ) mn2) ) ;
}
sortA_1_call_L( N, tmp, mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
A[ i] = ( ( long long ) ( tmp[ i] >> s2) ) + ( ( long long ) mn1) ;
B[ i] = ( ( long long ) ( tmp[ i] & ( ( 1ULL<< s2) - 1 ) ) ) + ( ( long long ) mn2) ;
}
return ;
}
sortI( N,A,B,mem) ;
}
template < class T1, class T2> void sortA_2_nonint_L( int N, T1 A[ ] , T2 B[ ] , void * mem = wmem) {
sortI( N,A,B,mem) ;
}
template < class T1, class T2> void sortA_2_call_L( int N, T1 A[ ] , T2 B[ ] , void * mem = wmem) {
sortA_2_nonint_L( N, A, B, mem) ;
}
template < class T2> void sortA_2_call_L( int N, int A[ ] , T2 B[ ] , void * mem) {
sortA_2_int_L( N, A, B, mem) ;
}
template < class T2> void sortA_2_call_L( int N, unsigned A[ ] , T2 B[ ] , void * mem) {
sortA_2_int_L( N, A, B, mem) ;
}
template < class T2> void sortA_2_call_L( int N, long long A[ ] , T2 B[ ] , void * mem) {
sortA_2_int_L( N, A, B, mem) ;
}
template < class T2> void sortA_2_call_L( int N, unsigned long long A[ ] , T2 B[ ] , void * mem) {
sortA_2_int_L( N, A, B, mem) ;
}
template < class T2> void sortA_2_call_L( int N, char A[ ] , T2 B[ ] , void * mem) {
sortA_2_int_L( N, A, B, mem) ;
}
template < class T1, class T2> void sortA( int N, T1 a[ ] , T2 b[ ] , void * mem = wmem) {
sortA_2_call_L( N, a, b, mem) ;
}
template < class T1, class T2, class T3> void sortA( int N, T1 a[ ] , T2 b[ ] , T3 c[ ] , void * mem = wmem) {
int i;
pair< T1, pair< T2, T3> > * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first = a[ i] ;
arr[ i] .second .first = b[ i] ;
arr[ i] .second .second = c[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first ;
b[ i] = arr[ i] .second .first ;
c[ i] = arr[ i] .second .second ;
}
}
template < class T1, class T2, class T3, class T4> void sortA( int N, T1 a[ ] , T2 b[ ] , T3 c[ ] , T4 d[ ] , void * mem = wmem) {
int i;
pair< pair< T1, T2> , pair< T3, T4> > * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first .first = a[ i] ;
arr[ i] .first .second = b[ i] ;
arr[ i] .second .first = c[ i] ;
arr[ i] .second .second = d[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first .first ;
b[ i] = arr[ i] .first .second ;
c[ i] = arr[ i] .second .first ;
d[ i] = arr[ i] .second .second ;
}
}
template < class T1, class T2> void sortA_index( int N, T1 a[ ] , T2 b[ ] , void * mem = wmem) {
int i;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
b[ i] = i;
}
sortA( N,a,b,mem) ;
}
template < class T1, class T2, class T3> void sortA_index( int N, T1 a[ ] , T2 b[ ] , T3 c[ ] , void * mem = wmem) {
int i;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
c[ i] = i;
}
sortA( N,a,b,c,mem) ;
}
template < class T1, class T2, class T3, class T4> void sortA_index( int N, T1 a[ ] , T2 b[ ] , T3 c[ ] , T4 d[ ] , void * mem = wmem) {
int i;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
d[ i] = i;
}
sortA( N,a,b,c,d,mem) ;
}
template < class T> struct segtree_Point_Maxval{
int N;
int logN;
T* mx;
void malloc ( int maxN, int once = 0 ) {
int i;
for ( i= 1 ; i< maxN; i* = 2 ) {
;
}
mx = new T[ 2 * i] ;
if ( once) {
setN( maxN) ;
}
}
void walloc( int maxN, int once = 0 , void ** mem = & wmem) {
int i;
for ( i= 1 ; i< maxN; i* = 2 ) {
;
}
walloc1d( & mx, 2 * i, mem) ;
if ( once) {
setN( maxN) ;
}
}
void free ( void ) {
delete [ ] mx;
}
T& operator[ ] ( int i) {
return mx[ N+ i] ;
}
void setN( int n, int zerofill = 1 , int dobuild = 1 ) {
int i;
for ( i= 1 ,logN= 0 ; i< n; i* = 2 ,logN++ ) {
;
}
N = i;
if ( zerofill) {
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
mx[ N+ i] = 0 ;
}
}
if ( dobuild) {
build( ) ;
}
}
void build( void ) {
int i;
for ( i= N- 1 ; i; i-- ) {
mx[ i] = max_L( mx[ 2 * i] , mx[ 2 * i+ 1 ] ) ;
}
}
inline void build( int a) {
while ( a > 1 ) {
a / = 2 ;
mx[ a] = max_L( mx[ 2 * a] , mx[ 2 * a+ 1 ] ) ;
}
}
inline void change( int a, T val) {
mx[ a+ N] = val;
build( a+ N) ;
}
inline void add( int a, T val) {
mx[ a+ N] + = val;
build( a+ N) ;
}
inline T getMaxVal( int a, int b) {
T res;
T tmp;
int fga = 0 ;
int fgb = 0 ;
a + = N;
b + = N;
while ( a < b) {
if ( a% 2 ) {
if ( fga) {
res = max_L( res, mx[ a] ) ;
}
else {
res = mx[ a] ;
fga = 1 ;
}
a++ ;
}
if ( b% 2 ) {
b-- ;
if ( fgb) {
tmp = max_L( mx[ b] , tmp) ;
}
else {
tmp = mx[ b] ;
fgb = 1 ;
}
}
a / = 2 ;
b / = 2 ;
}
if ( fga== 1 && fgb== 0 ) {
return res;
}
if ( fga== 0 && fgb== 1 ) {
return tmp;
}
if ( fga== 1 && fgb== 1 ) {
res = max_L( res, tmp) ;
return res;
}
return res;
}
}
;
template < class T, class S> inline int vec2arr( vector< T> & v, S arr[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] = v[ i] ;
}
return N;
}
template < class T, class S1, class S2> inline int vec2arr( vector< vector< T>> & v, S1 arr1[ ] , S2 arr2[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr1[ i] = v[ i] [ 0 ] ;
arr2[ i] = v[ i] [ 1 ] ;
}
return N;
}
template < class T, class S1, class S2, class S3> inline int vec2arr( vector< vector< T>> & v, S1 arr1[ ] , S2 arr2[ ] , S3 arr3[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr1[ i] = v[ i] [ 0 ] ;
arr2[ i] = v[ i] [ 1 ] ;
arr3[ i] = v[ i] [ 2 ] ;
}
return N;
}
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
class Solution{
public :
long long maxBalancedSubsequenceSum( vector< int > & nums) {
int i;
dummy_main( ) ;
static int N;
static int A[ 100000 ] ;
static int ind[ 100000 ] ;
segtree_Point_Maxval< long long > t;
long long res = 0 ;
long long tmp;
N = vec2arr( nums, A) ;
int Nzj9Y0kE;
cLtraits_try_make_signed< remove_reference< decltype( ( * ( ( int * ) NULL ) ) ) > :: type > :: type bkxOPzPX;
if ( N== 0 ) {
bkxOPzPX = 0 ;
}
else {
bkxOPzPX = A[ 0 ] ;
for ( Nzj9Y0kE= ( 1 ) ; Nzj9Y0kE< ( N) ; Nzj9Y0kE++ ) {
bkxOPzPX = max_L( bkxOPzPX, A[ Nzj9Y0kE] ) ;
}
}
tmp = bkxOPzPX;
if ( tmp <= 0 ) {
return tmp;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
A[ i] - = i;
}
sortA_index( N, A, ind) ;
t.walloc ( N, 1 ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( ind[ i] > 0 ) {
chmax( res, tmp = t.getMaxVal ( 0 , ind[ i] ) + A[ i] + ind[ i] ) ;
}
else {
chmax( res, tmp = 0 + A[ i] + ind[ i] ) ;
}
if ( tmp > 0 ) {
t.change ( ind[ i] , tmp) ;
}
}
return res;
}
}
;
// cLay version 20231031-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// ll maxBalancedSubsequenceSum(VI &nums) {
// dummy_main();
// static int N, A[1d5], ind[];
// segtree_Point_Maxval<ll> t;
// ll res = 0, tmp;
//
// N = vec2arr(nums, A);
// tmp = max(A(N));
// if(tmp <= 0) return tmp;
//
// rep(i,N) A[i] -= i;
// sortA_index(N, A, ind);
// t.walloc(N, 1);
//
// rep(i,N){
// res >?= tmp = if[ind[i]>0, t.getMaxVal(0, ind[i]), 0] + A[i] + ind[i];
// if(tmp > 0) t.change(ind[i], tmp);
// }
//
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUiKQojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgY0x0cmFpdHNfaWRlbnRpdHl7CiAgdXNpbmcgdHlwZSA9IFQ7Cn0KOwp0ZW1wbGF0ZTxjbGFzcyBUPiB1c2luZyBjTHRyYWl0c190cnlfbWFrZV9zaWduZWQgPQogIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAogICAgaXNfaW50ZWdyYWw8VD46OnZhbHVlLAogICAgbWFrZV9zaWduZWQ8VD4sCiAgICBjTHRyYWl0c19pZGVudGl0eTxUPgogICAgPjo6dHlwZTsKdGVtcGxhdGU8Y2xhc3MgVD4gdXNpbmcgY0x0cmFpdHNfdHJ5X21ha2VfdW5zaWduZWQgPQogIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAogICAgaXNfaW50ZWdyYWw8VD46OnZhbHVlLAogICAgbWFrZV91bnNpZ25lZDxUPiwKICAgIGNMdHJhaXRzX2lkZW50aXR5PFQ+CiAgICA+Ojp0eXBlOwp0ZW1wbGF0ZSA8Y2xhc3MgUywgY2xhc3MgVD4gc3RydWN0IGNMdHJhaXRzX2NvbW1vbl90eXBlewogIHVzaW5nIHRTID0gdHlwZW5hbWUgY0x0cmFpdHNfdHJ5X21ha2Vfc2lnbmVkPFM+Ojp0eXBlOwogIHVzaW5nIHRUID0gdHlwZW5hbWUgY0x0cmFpdHNfdHJ5X21ha2Vfc2lnbmVkPFQ+Ojp0eXBlOwogIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBjb21tb25fdHlwZTx0Uyx0VD46OnR5cGU7Cn0KOwp2b2lkKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVD4gaW5saW5lIGF1dG8gbWF4X0woUyBhLCBUIGIpCi0+IHR5cGVuYW1lIGNMdHJhaXRzX2NvbW1vbl90eXBlPFMsVD46OnR5cGV7CiAgcmV0dXJuICh0eXBlbmFtZSBjTHRyYWl0c19jb21tb25fdHlwZTxTLFQ+Ojp0eXBlKSBhID49ICh0eXBlbmFtZSBjTHRyYWl0c19jb21tb25fdHlwZTxTLFQ+Ojp0eXBlKSBiID8gYSA6IGI7Cn0KdGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVD4gaW5saW5lIFMgY2htaW4oUyAmYSwgVCBiKXsKICBpZihhPmIpewogICAgYT1iOwogIH0KICByZXR1cm4gYTsKfQp0ZW1wbGF0ZTxjbGFzcyBTLCBjbGFzcyBUPiBpbmxpbmUgUyBjaG1heChTICZhLCBUIGIpewogIGlmKGE8Yil7CiAgICBhPWI7CiAgfQogIHJldHVybiBhOwp9CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBTIGRpdnVwX0woUyBhLCBUIGIpewogIHJldHVybiAoYStiLTEpL2I7Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MxZChUICoqYXJyLCBpbnQgeDEsIGludCB4Miwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICB3YWxsb2MxZChhcnIsIHgyLXgxLCBtZW0pOwogICgqYXJyKSAtPSB4MTsKfQppbmxpbmUgaW50IElsb2cyX2ZfTChjb25zdCBpbnQgbil7CiAgaW50IHJlczsKICBpZihuIDw9IDApewogICAgcmV0dXJuIC0xOwogIH0KICByZXMgPSBzaXplb2YoaW50KSAqIDggLSBfX2J1aWx0aW5fY2x6KG4pIC0gMTsKICByZXR1cm4gcmVzOwp9CmlubGluZSBpbnQgSWxvZzJfZl9MKGNvbnN0IGxvbmcgbG9uZyBuKXsKICBpbnQgcmVzOwogIGlmKG4gPD0gMCl7CiAgICByZXR1cm4gLTE7CiAgfQogIHJlcyA9IHNpemVvZihsb25nIGxvbmcpICogOCAtIF9fYnVpbHRpbl9jbHpsbChuKSAtIDE7CiAgcmV0dXJuIHJlczsKfQp0ZW1wbGF0ZTxjbGFzcyBUMT4gdm9pZCBzb3J0SShpbnQgTiwgVDEgYVtdLCB2b2lkICptZW0gPSB3bWVtKXsKICBzb3J0KGEsIGErTik7Cn0KdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPiB2b2lkIHNvcnRJKGludCBOLCBUMSBhW10sIFQyIGJbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgaW50IGk7CiAgcGFpcjxUMSwgVDI+KmFycjsKICB3YWxsb2MxZCgmYXJyLCBOLCAmbWVtKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFycltpXS5maXJzdCA9IGFbaV07CiAgICBhcnJbaV0uc2Vjb25kID0gYltpXTsKICB9CiAgc29ydChhcnIsIGFycitOKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFbaV0gPSBhcnJbaV0uZmlyc3Q7CiAgICBiW2ldID0gYXJyW2ldLnNlY29uZDsKICB9Cn0KdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMz4gdm9pZCBzb3J0SShpbnQgTiwgVDEgYVtdLCBUMiBiW10sIFQzIGNbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgaW50IGk7CiAgcGFpcjxUMSwgcGFpcjxUMiwgVDM+ID4qYXJyOwogIHdhbGxvYzFkKCZhcnIsIE4sICZtZW0pOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgYXJyW2ldLmZpcnN0ID0gYVtpXTsKICAgIGFycltpXS5zZWNvbmQuZmlyc3QgPSBiW2ldOwogICAgYXJyW2ldLnNlY29uZC5zZWNvbmQgPSBjW2ldOwogIH0KICBzb3J0KGFyciwgYXJyK04pOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgYVtpXSA9IGFycltpXS5maXJzdDsKICAgIGJbaV0gPSBhcnJbaV0uc2Vjb25kLmZpcnN0OwogICAgY1tpXSA9IGFycltpXS5zZWNvbmQuc2Vjb25kOwogIH0KfQp0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzLCBjbGFzcyBUND4gdm9pZCBzb3J0SShpbnQgTiwgVDEgYVtdLCBUMiBiW10sIFQzIGNbXSwgVDQgZFtdLCB2b2lkICptZW0gPSB3bWVtKXsKICBpbnQgaTsKICBwYWlyPHBhaXI8VDEsIFQyPiwgcGFpcjxUMywgVDQ+ID4qYXJyOwogIHdhbGxvYzFkKCZhcnIsIE4sICZtZW0pOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgYXJyW2ldLmZpcnN0LmZpcnN0ID0gYVtpXTsKICAgIGFycltpXS5maXJzdC5zZWNvbmQgPSBiW2ldOwogICAgYXJyW2ldLnNlY29uZC5maXJzdCA9IGNbaV07CiAgICBhcnJbaV0uc2Vjb25kLnNlY29uZCA9IGRbaV07CiAgfQogIHNvcnQoYXJyLCBhcnIrTik7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhW2ldID0gYXJyW2ldLmZpcnN0LmZpcnN0OwogICAgYltpXSA9IGFycltpXS5maXJzdC5zZWNvbmQ7CiAgICBjW2ldID0gYXJyW2ldLnNlY29uZC5maXJzdDsKICAgIGRbaV0gPSBhcnJbaV0uc2Vjb25kLnNlY29uZDsKICB9Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIGludCBzb3J0X2hlbHBlcl9nZXRiaXQoVCBBW10pewogIHJldHVybiAtMTsKfQp0ZW1wbGF0ZTw+IGlubGluZSBpbnQgc29ydF9oZWxwZXJfZ2V0Yml0KGludCBBW10pewogIHJldHVybiBzaXplb2YoaW50KSo4Owp9CnRlbXBsYXRlPD4gaW5saW5lIGludCBzb3J0X2hlbHBlcl9nZXRiaXQodW5zaWduZWQgQVtdKXsKICByZXR1cm4gc2l6ZW9mKHVuc2lnbmVkKSo4Owp9CnRlbXBsYXRlPD4gaW5saW5lIGludCBzb3J0X2hlbHBlcl9nZXRiaXQobG9uZyBsb25nIEFbXSl7CiAgcmV0dXJuIHNpemVvZihsb25nIGxvbmcpKjg7Cn0KdGVtcGxhdGU8PiBpbmxpbmUgaW50IHNvcnRfaGVscGVyX2dldGJpdCh1bnNpZ25lZCBsb25nIGxvbmcgQVtdKXsKICByZXR1cm4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykqODsKfQp0ZW1wbGF0ZTw+IGlubGluZSBpbnQgc29ydF9oZWxwZXJfZ2V0Yml0KGNoYXIgQVtdKXsKICByZXR1cm4gc2l6ZW9mKGNoYXIpKjg7Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBzb3J0QV8xX2ludF9MKGludCBOLCBUIEFbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgaW50IGk7CiAgaW50IGo7CiAgaW50IGs7CiAgaW50IGI7CiAgaW50IHM7CiAgaW50IG9rOwogIG9rID0gMTsKICBmb3IoaT0oMSk7aTwoTik7aSsrKXsKICAgIGlmKEFbaS0xXSA+IEFbaV0pewogICAgICBvayA9IDA7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZihvayl7CiAgICByZXR1cm47CiAgfQogIGlmKE4gPCAxMjgpewogICAgc29ydChBLEErTik7CiAgICByZXR1cm47CiAgfQogIGIgPSBzb3J0X2hlbHBlcl9nZXRiaXQoQSk7CiAgaWYoYj09LTEpewogICAgc29ydChBLEErTik7CiAgICByZXR1cm47CiAgfQogIFQgbW47CiAgVCBteDsKICBtbiA9IG14ID0gQVswXTsKICBmb3IoaT0oMSk7aTwoTik7aSsrKXsKICAgIGNobWluKG1uLCBBW2ldKTsKICB9CiAgZm9yKGk9KDEpO2k8KE4pO2krKyl7CiAgICBjaG1heChteCwgQVtpXSk7CiAgfQogIG9rID0gMTsKICBpZihtbiA8IDAgJiYgbXggPiAwICYmIChtbiA8IC1OIHx8IG14ID4gTikpewogICAgb2sgPSAwOwogIH0KICBpZihvayAmJiBteCAtIG1uID4gTil7CiAgICBvayA9IDA7CiAgfQogIGlmKG9rKXsKICAgIGludCp0bXA7CiAgICB3YWxsb2MxZCgmdG1wLCBteC1tbisxLCAmbWVtKTsKICAgIGZvcihpPSgwKTtpPChteC1tbisxKTtpKyspewogICAgICB0bXBbaV0gPSAwOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIHRtcFtBW2ldLW1uXSsrOwogICAgfQogICAgayA9IDA7CiAgICBmb3IoaT0oMCk7aTwobXgtbW4rMSk7aSsrKXsKICAgICAgd2hpbGUodG1wW2ldID4gMCl7CiAgICAgICAgdG1wW2ldLS07CiAgICAgICAgQVtrKytdID0gaSttbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuOwogIH0KICB7CiAgICB0eXBlbmFtZSBtYWtlX3Vuc2lnbmVkPFQ+Ojp0eXBlICp0WzJdOwogICAgdHlwZW5hbWUgbWFrZV91bnNpZ25lZDxUPjo6dHlwZSAgbWFzazsKICAgIHR5cGVuYW1lIG1ha2VfdW5zaWduZWQ8VD46OnR5cGUgIGN1cjsKICAgIHR5cGVuYW1lIG1ha2VfdW5zaWduZWQ8VD46OnR5cGUgIG9uZSA9IDE7CiAgICBUIHRvbmUgPSAxOwogICAgaW50KnBvczsKICAgIGludCBubiA9IDA7CiAgICBpbnQgc3M7CiAgICBzID1JbG9nMl9mX0woTik7CiAgICBpZihzID4gOCl7CiAgICAgIHMgPSAoOCArIChzLTcpLzIpOwogICAgfQogICAgc3MgPSAxOwogICAgZm9yKDs7KXsKICAgICAgaWYoc3MgPj0gYil7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYoIG14ID49IDAgJiYgKHRvbmUgPDwgKHNzLTEpKSA8IG14ICl7CiAgICAgICAgc3MrKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiggbW4gPCAwICYmIC0odG9uZSA8PCAoc3MtMSkpID49IG1uICl7CiAgICAgICAgc3MrKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KICAgIGsgPShkaXZ1cF9MKHNzLHMpKTsKICAgIHMgPShkaXZ1cF9MKHNzLGspKTsKICAgIG1hc2sgPSAwOwogICAgZm9yKGk9KDApO2k8KGIpO2krKyl7CiAgICAgIGlmKGkgPCBzKmspewogICAgICAgIG1hc2sgfD0gb25lIDw8IGk7CiAgICAgIH0KICAgIH0KICAgIHRbMF0gPSAodHlwZW5hbWUgbWFrZV91bnNpZ25lZDxUPjo6dHlwZSAqKSBBOwogICAgd2FsbG9jMWQoJnRbMV0sIE4sICZtZW0pOwogICAgd2FsbG9jMWQoJnBvcywgKDE8PHMpKzEsICZtZW0pOwogICAgZm9yKGo9KDApO2o8KGspO2orKyl7CiAgICAgIGN1ciA9IDA7CiAgICAgIGZvcihpPSgwKTtpPChiKTtpKyspewogICAgICAgIGlmKHMqaiA8PSBpICYmIGkgPCBzKihqKzEpICYmIGkgPCBiKXsKICAgICAgICAgIGN1ciB8PSBvbmUgPDwgaTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yKGk9KDApO2k8KCgxPDxzKSsxKTtpKyspewogICAgICAgIHBvc1tpXSA9IDA7CiAgICAgIH0KICAgICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgICAgcG9zWygodFtubl1baV0mY3VyKT4+KHMqaikpKzFdKys7CiAgICAgIH0KICAgICAgZm9yKGk9KDApO2k8KCgxPDxzKSk7aSsrKXsKICAgICAgICBwb3NbaSsxXSArPSBwb3NbaV07CiAgICAgIH0KICAgICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgICAgdFtubl4xXVtwb3NbKHRbbm5dW2ldJmN1cik+PihzKmopXSsrXSA9IHRbbm5dW2ldOwogICAgICB9CiAgICAgIG5uIF49IDE7CiAgICAgIG1hc2sgXj0gY3VyOwogICAgfQogICAgaWYobW4gPCAwICYmIG14ID49IDApewogICAgICBrID0gMDsKICAgICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgICAgaWYoQVtpXSA8IDApewogICAgICAgICAgaysrOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IoaT0oMCk7aTwoayk7aSsrKXsKICAgICAgICB0W25uXjFdW2ldID0gdFtubl1bTi1rK2ldOwogICAgICB9CiAgICAgIGZvcihpPShrKTtpPChOKTtpKyspewogICAgICAgIHRbbm5eMV1baV0gPSB0W25uXVtpLWtdOwogICAgICB9CiAgICAgIG5uIF49IDE7CiAgICB9CiAgICBpZihubj09MSl7CiAgICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICAgIHRbMF1baV0gPSB0WzFdW2ldOwogICAgICB9CiAgICB9CiAgICByZXR1cm47CiAgfQogIHNvcnQoQSwgQStOKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIHNvcnRBXzFfbm9uaW50X0woaW50IE4sIFQgQVtdLCB2b2lkICptZW0gPSB3bWVtKXsKICBzb3J0KEEsQStOKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIHNvcnRBXzFfY2FsbF9MKGludCBOLCBUIEFbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgc29ydEFfMV9ub25pbnRfTChOLCBBLCBtZW0pOwp9CnRlbXBsYXRlPD4gdm9pZCBzb3J0QV8xX2NhbGxfTChpbnQgTiwgaW50IEFbXSwgdm9pZCAqbWVtKXsKICBzb3J0QV8xX2ludF9MKE4sIEEsIG1lbSk7Cn0KdGVtcGxhdGU8PiB2b2lkIHNvcnRBXzFfY2FsbF9MKGludCBOLCB1bnNpZ25lZCBBW10sIHZvaWQgKm1lbSl7CiAgc29ydEFfMV9pbnRfTChOLCBBLCBtZW0pOwp9CnRlbXBsYXRlPD4gdm9pZCBzb3J0QV8xX2NhbGxfTChpbnQgTiwgbG9uZyBsb25nIEFbXSwgdm9pZCAqbWVtKXsKICBzb3J0QV8xX2ludF9MKE4sIEEsIG1lbSk7Cn0KdGVtcGxhdGU8PiB2b2lkIHNvcnRBXzFfY2FsbF9MKGludCBOLCB1bnNpZ25lZCBsb25nIGxvbmcgQVtdLCB2b2lkICptZW0pewogIHNvcnRBXzFfaW50X0woTiwgQSwgbWVtKTsKfQp0ZW1wbGF0ZTw+IHZvaWQgc29ydEFfMV9jYWxsX0woaW50IE4sIGNoYXIgQVtdLCB2b2lkICptZW0pewogIHNvcnRBXzFfaW50X0woTiwgQSwgbWVtKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUMT4gdm9pZCBzb3J0QShpbnQgTiwgVDEgYVtdLCB2b2lkICptZW0gPSB3bWVtKXsKICBzb3J0QV8xX2NhbGxfTChOLCBhLCBtZW0pOwp9CnRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4gdm9pZCBzb3J0QV8yX2ludF9MKGludCBOLCBUMSBBW10sIFQyIEJbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgaW50IGk7CiAgaW50IGJfYTsKICBpbnQgYl9iOwogIGludCBzMTsKICBpbnQgczI7CiAgaW50IHNvMjsKICBUMSBtbjE7CiAgVDEgbXgxOwogIFQyIG1uMjsKICBUMiBteDI7CiAgdHlwZW5hbWUgY0x0cmFpdHNfdHJ5X21ha2VfdW5zaWduZWQ8VDE+Ojp0eXBlIHIxOwogIHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3Vuc2lnbmVkPFQyPjo6dHlwZSByMjsKICBzbzIgPSAxOwogIGZvcihpPSgxKTtpPChOKTtpKyspewogICAgaWYoQVtpLTFdID4gQVtpXSB8fCAoQVtpLTFdPT1BW2ldICYmIEJbaS0xXSA+IEJbaV0pKXsKICAgICAgc28yID0gMDsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmKHNvMil7CiAgICByZXR1cm47CiAgfQogIHNvMiA9IDE7CiAgZm9yKGk9KDEpO2k8KE4pO2krKyl7CiAgICBpZihBW2ktMV0gPiBBW2ldKXsKICAgICAgc28yID0gMDsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmKHNvMj09MSl7CiAgICBpbnQgayA9IDA7CiAgICBmb3IoaT0oMSk7aTwoTik7aSsrKXsKICAgICAgaWYoQVtpXSAhPSBBW2ktMV0pewogICAgICAgIHNvcnRBXzFfY2FsbF9MKGktaywgQitrLCBtZW0pOwogICAgICAgIGsgPSBpOwogICAgICB9CiAgICB9CiAgICBzb3J0QV8xX2NhbGxfTChOLWssIEIraywgbWVtKTsKICAgIHJldHVybjsKICB9CiAgaWYoTiA8IDEyOCl7CiAgICBzb3J0SShOLEEsQixtZW0pOwogICAgcmV0dXJuOwogIH0KICBiX2EgPSBzb3J0X2hlbHBlcl9nZXRiaXQoQSk7CiAgYl9iID0gc29ydF9oZWxwZXJfZ2V0Yml0KEIpOwogIGlmKGJfYSA9PSAtMSB8fCBiX2IgPT0gLTEpewogICAgc29ydEkoTixBLEIsbWVtKTsKICAgIHJldHVybjsKICB9CiAgbW4xID0gbXgxID0gQVswXTsKICBmb3IoaT0oMSk7aTwoTik7aSsrKXsKICAgIGNobWluKG1uMSwgQVtpXSk7CiAgfQogIGZvcihpPSgxKTtpPChOKTtpKyspewogICAgY2htYXgobXgxLCBBW2ldKTsKICB9CiAgbW4yID0gbXgyID0gQlswXTsKICBmb3IoaT0oMSk7aTwoTik7aSsrKXsKICAgIGNobWluKG1uMiwgQltpXSk7CiAgfQogIGZvcihpPSgxKTtpPChOKTtpKyspewogICAgY2htYXgobXgyLCBCW2ldKTsKICB9CiAgaWYobW4xIDwgLTQ2MTE2ODYwMTYyNzk5MDQyNTZMTCB8fCBtbjIgPCAtNDYxMTY4NjAxNjI3OTkwNDI1NkxMIHx8IG14MSA+IDQ2MTE2ODYwMTYyNzk5MDQyNTZMTCB8fCBteDIgPiA0NjExNjg2MDE2Mjc5OTA0MjU2TEwgfHwgbXgxLW1uMSA+IDQ2MTE2ODYwMTYyNzk5MDQyNTZMTCB8fCBteDItbW4yID4gNDYxMTY4NjAxNjI3OTkwNDI1NkxMKXsKICAgIHNvcnRJKE4sQSxCLG1lbSk7CiAgICByZXR1cm47CiAgfQogIHIxID0gKHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3Vuc2lnbmVkPFQxPjo6dHlwZSkobXgxKSAtICh0eXBlbmFtZSBjTHRyYWl0c190cnlfbWFrZV91bnNpZ25lZDxUMT46OnR5cGUpKG1uMSk7CiAgcjIgPSAodHlwZW5hbWUgY0x0cmFpdHNfdHJ5X21ha2VfdW5zaWduZWQ8VDI+Ojp0eXBlKShteDIpIC0gKHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3Vuc2lnbmVkPFQyPjo6dHlwZSkobW4yKTsKICBpZihyMSA9PSAwKXsKICAgIHNvcnRBXzFfY2FsbF9MKE4sIEIsIG1lbSk7CiAgICByZXR1cm47CiAgfQogIGlmKHIyID09IDApewogICAgc29ydEFfMV9jYWxsX0woTiwgQSwgbWVtKTsKICAgIHJldHVybjsKICB9CiAgaWYocjEgPD0gTil7CiAgICBzbzIgPSAxOwogICAgZm9yKGk9KDEpO2k8KE4pO2krKyl7CiAgICAgIGlmKEJbaS0xXSA+IEJbaV0pewogICAgICAgIHNvMiA9IDA7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmKHNvMiA9PSAxKXsKICAgICAgVDEqYWE7CiAgICAgIFQyKmJiOwogICAgICBpbnQqcG9zOwogICAgICBpbnQgazsKICAgICAgd2FsbG9jMWQoJmFhLE4sJm1lbSk7CiAgICAgIHdhbGxvYzFkKCZiYixOLCZtZW0pOwogICAgICB3YWxsb2MxZCgmcG9zLHIxKzIsJm1lbSk7CiAgICAgIGZvcihpPSgwKTtpPChyMSsyKTtpKyspewogICAgICAgIHBvc1tpXSA9IDA7CiAgICAgIH0KICAgICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgICAgYWFbaV0gPSBBW2ldOwogICAgICB9CiAgICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICAgIGJiW2ldID0gQltpXTsKICAgICAgfQogICAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgICBwb3NbKHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3Vuc2lnbmVkPFQxPjo6dHlwZSkoKHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3Vuc2lnbmVkPFQxPjo6dHlwZSlhYVtpXS0odHlwZW5hbWUgY0x0cmFpdHNfdHJ5X21ha2VfdW5zaWduZWQ8VDE+Ojp0eXBlKW1uMSkrMV0rKzsKICAgICAgfQogICAgICBmb3IoaT0oMSk7aTwocjErMik7aSsrKXsKICAgICAgICBwb3NbaV0gKz0gcG9zW2ktMV07CiAgICAgIH0KICAgICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgICAgayA9IHBvc1sodHlwZW5hbWUgY0x0cmFpdHNfdHJ5X21ha2VfdW5zaWduZWQ8VDE+Ojp0eXBlKSgodHlwZW5hbWUgY0x0cmFpdHNfdHJ5X21ha2VfdW5zaWduZWQ8VDE+Ojp0eXBlKWFhW2ldLSh0eXBlbmFtZSBjTHRyYWl0c190cnlfbWFrZV91bnNpZ25lZDxUMT46OnR5cGUpbW4xKSswXSsrOwogICAgICAgIEFba10gPSBhYVtpXTsKICAgICAgICBCW2tdID0gYmJbaV07CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogIH0KICBzMSA9IHMyID0gMTsKICB3aGlsZSggczEgPCA2NCAmJiByMSA+PSAoMVVMTDw8czEpICl7CiAgICBzMSsrOwogIH0KICB3aGlsZSggczIgPCA2NCAmJiByMiA+PSAoMVVMTDw8czIpICl7CiAgICBzMisrOwogIH0KICBpZihzMSArIHMyIDw9IDMyKXsKICAgIHVuc2lnbmVkKnRtcDsKICAgIHdhbGxvYzFkKCZ0bXAsTiwmbWVtKTsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICB0bXBbaV0gPSAoKCh1bnNpZ25lZCkoKGludClBW2ldLShpbnQpbW4xKSkgPDwgczIpIHwgKCh1bnNpZ25lZCkoKGludClCW2ldLShpbnQpbW4yKSk7CiAgICB9CiAgICBzb3J0QV8xX2NhbGxfTChOLCB0bXAsIG1lbSk7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgQVtpXSA9ICgoaW50KSh0bXBbaV0gPj4gczIpKSArICgoaW50KW1uMSk7CiAgICAgIEJbaV0gPSAoKGludCkodG1wW2ldICYgKCgxVTw8czIpLTEpKSkgKyAoKGludCltbjIpOwogICAgfQogICAgcmV0dXJuOwogIH0KICBpZihzMSArIHMyIDw9IDY0KXsKICAgIHVuc2lnbmVkIGxvbmcgbG9uZyp0bXA7CiAgICB3YWxsb2MxZCgmdG1wLE4sJm1lbSk7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgdG1wW2ldID0gKCgodW5zaWduZWQgbG9uZyBsb25nKSgobG9uZyBsb25nKUFbaV0tKGxvbmcgbG9uZyltbjEpKSA8PCBzMikgfCAoKHVuc2lnbmVkIGxvbmcgbG9uZykoKGxvbmcgbG9uZylCW2ldLShsb25nIGxvbmcpbW4yKSk7CiAgICB9CiAgICBzb3J0QV8xX2NhbGxfTChOLCB0bXAsIG1lbSk7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgQVtpXSA9ICgobG9uZyBsb25nKSh0bXBbaV0gPj4gczIpKSArICgobG9uZyBsb25nKW1uMSk7CiAgICAgIEJbaV0gPSAoKGxvbmcgbG9uZykodG1wW2ldICYgKCgxVUxMPDxzMiktMSkpKSArICgobG9uZyBsb25nKW1uMik7CiAgICB9CiAgICByZXR1cm47CiAgfQogIHNvcnRJKE4sQSxCLG1lbSk7Cn0KdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPiB2b2lkIHNvcnRBXzJfbm9uaW50X0woaW50IE4sIFQxIEFbXSwgVDIgQltdLCB2b2lkICptZW0gPSB3bWVtKXsKICBzb3J0SShOLEEsQixtZW0pOwp9CnRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4gdm9pZCBzb3J0QV8yX2NhbGxfTChpbnQgTiwgVDEgQVtdLCBUMiBCW10sIHZvaWQgKm1lbSA9IHdtZW0pewogIHNvcnRBXzJfbm9uaW50X0woTiwgQSwgQiwgbWVtKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUMj4gdm9pZCBzb3J0QV8yX2NhbGxfTChpbnQgTiwgaW50IEFbXSwgVDIgQltdLCB2b2lkICptZW0pewogIHNvcnRBXzJfaW50X0woTiwgQSwgQiwgbWVtKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUMj4gdm9pZCBzb3J0QV8yX2NhbGxfTChpbnQgTiwgdW5zaWduZWQgQVtdLCBUMiBCW10sIHZvaWQgKm1lbSl7CiAgc29ydEFfMl9pbnRfTChOLCBBLCBCLCBtZW0pOwp9CnRlbXBsYXRlPGNsYXNzIFQyPiB2b2lkIHNvcnRBXzJfY2FsbF9MKGludCBOLCBsb25nIGxvbmcgQVtdLCBUMiBCW10sIHZvaWQgKm1lbSl7CiAgc29ydEFfMl9pbnRfTChOLCBBLCBCLCBtZW0pOwp9CnRlbXBsYXRlPGNsYXNzIFQyPiB2b2lkIHNvcnRBXzJfY2FsbF9MKGludCBOLCB1bnNpZ25lZCBsb25nIGxvbmcgQVtdLCBUMiBCW10sIHZvaWQgKm1lbSl7CiAgc29ydEFfMl9pbnRfTChOLCBBLCBCLCBtZW0pOwp9CnRlbXBsYXRlPGNsYXNzIFQyPiB2b2lkIHNvcnRBXzJfY2FsbF9MKGludCBOLCBjaGFyIEFbXSwgVDIgQltdLCB2b2lkICptZW0pewogIHNvcnRBXzJfaW50X0woTiwgQSwgQiwgbWVtKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+IHZvaWQgc29ydEEoaW50IE4sIFQxIGFbXSwgVDIgYltdLCB2b2lkICptZW0gPSB3bWVtKXsKICBzb3J0QV8yX2NhbGxfTChOLCBhLCBiLCBtZW0pOwp9CnRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMiwgY2xhc3MgVDM+IHZvaWQgc29ydEEoaW50IE4sIFQxIGFbXSwgVDIgYltdLCBUMyBjW10sIHZvaWQgKm1lbSA9IHdtZW0pewogIGludCBpOwogIHBhaXI8VDEsIHBhaXI8VDIsIFQzPiA+KmFycjsKICB3YWxsb2MxZCgmYXJyLCBOLCAmbWVtKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFycltpXS5maXJzdCA9IGFbaV07CiAgICBhcnJbaV0uc2Vjb25kLmZpcnN0ID0gYltpXTsKICAgIGFycltpXS5zZWNvbmQuc2Vjb25kID0gY1tpXTsKICB9CiAgc29ydChhcnIsIGFycitOKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFbaV0gPSBhcnJbaV0uZmlyc3Q7CiAgICBiW2ldID0gYXJyW2ldLnNlY29uZC5maXJzdDsKICAgIGNbaV0gPSBhcnJbaV0uc2Vjb25kLnNlY29uZDsKICB9Cn0KdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMywgY2xhc3MgVDQ+IHZvaWQgc29ydEEoaW50IE4sIFQxIGFbXSwgVDIgYltdLCBUMyBjW10sIFQ0IGRbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgaW50IGk7CiAgcGFpcjxwYWlyPFQxLCBUMj4sIHBhaXI8VDMsIFQ0PiA+KmFycjsKICB3YWxsb2MxZCgmYXJyLCBOLCAmbWVtKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFycltpXS5maXJzdC5maXJzdCA9IGFbaV07CiAgICBhcnJbaV0uZmlyc3Quc2Vjb25kID0gYltpXTsKICAgIGFycltpXS5zZWNvbmQuZmlyc3QgPSBjW2ldOwogICAgYXJyW2ldLnNlY29uZC5zZWNvbmQgPSBkW2ldOwogIH0KICBzb3J0KGFyciwgYXJyK04pOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgYVtpXSA9IGFycltpXS5maXJzdC5maXJzdDsKICAgIGJbaV0gPSBhcnJbaV0uZmlyc3Quc2Vjb25kOwogICAgY1tpXSA9IGFycltpXS5zZWNvbmQuZmlyc3Q7CiAgICBkW2ldID0gYXJyW2ldLnNlY29uZC5zZWNvbmQ7CiAgfQp9CnRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4gdm9pZCBzb3J0QV9pbmRleChpbnQgTiwgVDEgYVtdLCBUMiBiW10sIHZvaWQgKm1lbSA9IHdtZW0pewogIGludCBpOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgYltpXSA9IGk7CiAgfQogIHNvcnRBKE4sYSxiLG1lbSk7Cn0KdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMz4gdm9pZCBzb3J0QV9pbmRleChpbnQgTiwgVDEgYVtdLCBUMiBiW10sIFQzIGNbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgaW50IGk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBjW2ldID0gaTsKICB9CiAgc29ydEEoTixhLGIsYyxtZW0pOwp9CnRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMiwgY2xhc3MgVDMsIGNsYXNzIFQ0PiB2b2lkIHNvcnRBX2luZGV4KGludCBOLCBUMSBhW10sIFQyIGJbXSwgVDMgY1tdLCBUNCBkW10sIHZvaWQgKm1lbSA9IHdtZW0pewogIGludCBpOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgZFtpXSA9IGk7CiAgfQogIHNvcnRBKE4sYSxiLGMsZCxtZW0pOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCBzZWd0cmVlX1BvaW50X01heHZhbHsKICBpbnQgTjsKICBpbnQgbG9nTjsKICBUKm14OwogIHZvaWQgbWFsbG9jKGludCBtYXhOLCBpbnQgb25jZSA9IDApewogICAgaW50IGk7CiAgICBmb3IoaT0xO2k8bWF4TjtpKj0yKXsKICAgICAgOwogICAgfQogICAgbXggPSBuZXcgVFsyKmldOwogICAgaWYob25jZSl7CiAgICAgIHNldE4obWF4Tik7CiAgICB9CiAgfQogIHZvaWQgd2FsbG9jKGludCBtYXhOLCBpbnQgb25jZSA9IDAsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgICBpbnQgaTsKICAgIGZvcihpPTE7aTxtYXhOO2kqPTIpewogICAgICA7CiAgICB9CiAgICB3YWxsb2MxZCgmbXgsIDIqaSwgbWVtKTsKICAgIGlmKG9uY2UpewogICAgICBzZXROKG1heE4pOwogICAgfQogIH0KICB2b2lkIGZyZWUodm9pZCl7CiAgICBkZWxldGUgW10gbXg7CiAgfQogIFQmIG9wZXJhdG9yW10oaW50IGkpewogICAgcmV0dXJuIG14W04raV07CiAgfQogIHZvaWQgc2V0TihpbnQgbiwgaW50IHplcm9maWxsID0gMSwgaW50IGRvYnVpbGQgPSAxKXsKICAgIGludCBpOwogICAgZm9yKGk9MSxsb2dOPTA7aTxuO2kqPTIsbG9nTisrKXsKICAgICAgOwogICAgfQogICAgTiA9IGk7CiAgICBpZih6ZXJvZmlsbCl7CiAgICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICAgIG14W04raV0gPSAwOwogICAgICB9CiAgICB9CiAgICBpZihkb2J1aWxkKXsKICAgICAgYnVpbGQoKTsKICAgIH0KICB9CiAgdm9pZCBidWlsZCh2b2lkKXsKICAgIGludCBpOwogICAgZm9yKGk9Ti0xO2k7aS0tKXsKICAgICAgbXhbaV0gPW1heF9MKG14WzIqaV0sIG14WzIqaSsxXSk7CiAgICB9CiAgfQogIGlubGluZSB2b2lkIGJ1aWxkKGludCBhKXsKICAgIHdoaWxlKGEgPiAxKXsKICAgICAgYSAvPSAyOwogICAgICBteFthXSA9bWF4X0wobXhbMiphXSwgbXhbMiphKzFdKTsKICAgIH0KICB9CiAgaW5saW5lIHZvaWQgY2hhbmdlKGludCBhLCBUIHZhbCl7CiAgICBteFthK05dID0gdmFsOwogICAgYnVpbGQoYStOKTsKICB9CiAgaW5saW5lIHZvaWQgYWRkKGludCBhLCBUIHZhbCl7CiAgICBteFthK05dICs9IHZhbDsKICAgIGJ1aWxkKGErTik7CiAgfQogIGlubGluZSBUIGdldE1heFZhbChpbnQgYSwgaW50IGIpewogICAgVCByZXM7CiAgICBUIHRtcDsKICAgIGludCBmZ2EgPSAwOwogICAgaW50IGZnYiA9IDA7CiAgICBhICs9IE47CiAgICBiICs9IE47CiAgICB3aGlsZShhIDwgYil7CiAgICAgIGlmKGElMil7CiAgICAgICAgaWYoZmdhKXsKICAgICAgICAgIHJlcyA9bWF4X0wocmVzLCBteFthXSk7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICByZXMgPSBteFthXTsKICAgICAgICAgIGZnYSA9IDE7CiAgICAgICAgfQogICAgICAgIGErKzsKICAgICAgfQogICAgICBpZihiJTIpewogICAgICAgIGItLTsKICAgICAgICBpZihmZ2IpewogICAgICAgICAgdG1wID1tYXhfTChteFtiXSwgdG1wKTsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgIHRtcCA9IG14W2JdOwogICAgICAgICAgZmdiID0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYSAvPSAyOwogICAgICBiIC89IDI7CiAgICB9CiAgICBpZihmZ2E9PTEgJiYgZmdiPT0wKXsKICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgIGlmKGZnYT09MCAmJiBmZ2I9PTEpewogICAgICByZXR1cm4gdG1wOwogICAgfQogICAgaWYoZmdhPT0xICYmIGZnYj09MSl7CiAgICAgIHJlcyA9bWF4X0wocmVzLCB0bXApOwogICAgICByZXR1cm4gcmVzOwogICAgfQogICAgcmV0dXJuIHJlczsKICB9Cn0KOwp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTPiBpbmxpbmUgaW50IHZlYzJhcnIodmVjdG9yPFQ+ICZ2LCBTIGFycltdKXsKICBpbnQgaTsKICBpbnQgTiA9IHYuc2l6ZSgpOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgYXJyW2ldID0gdltpXTsKICB9CiAgcmV0dXJuIE47Cn0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUzEsIGNsYXNzIFMyPiBpbmxpbmUgaW50IHZlYzJhcnIodmVjdG9yPHZlY3RvcjxUPj4gJnYsIFMxIGFycjFbXSwgUzIgYXJyMltdKXsKICBpbnQgaTsKICBpbnQgTiA9IHYuc2l6ZSgpOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgYXJyMVtpXSA9IHZbaV1bMF07CiAgICBhcnIyW2ldID0gdltpXVsxXTsKICB9CiAgcmV0dXJuIE47Cn0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUzEsIGNsYXNzIFMyLCBjbGFzcyBTMz4gaW5saW5lIGludCB2ZWMyYXJyKHZlY3Rvcjx2ZWN0b3I8VD4+ICZ2LCBTMSBhcnIxW10sIFMyIGFycjJbXSwgUzMgYXJyM1tdKXsKICBpbnQgaTsKICBpbnQgTiA9IHYuc2l6ZSgpOwogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgYXJyMVtpXSA9IHZbaV1bMF07CiAgICBhcnIyW2ldID0gdltpXVsxXTsKICAgIGFycjNbaV0gPSB2W2ldWzJdOwogIH0KICByZXR1cm4gTjsKfQojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHdtZW0gPSBtZW1hcnI7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIGxvbmcgbG9uZyBtYXhCYWxhbmNlZFN1YnNlcXVlbmNlU3VtKHZlY3RvcjxpbnQ+ICZudW1zKXsKICAgIGludCBpOwogICAgZHVtbXlfbWFpbigpOwogICAgc3RhdGljIGludCBOOwogICAgc3RhdGljIGludCBBWzEwMDAwMF07CiAgICBzdGF0aWMgaW50IGluZFsxMDAwMDBdOwogICAgc2VndHJlZV9Qb2ludF9NYXh2YWw8bG9uZyBsb25nPiB0OwogICAgbG9uZyBsb25nIHJlcyA9IDA7CiAgICBsb25nIGxvbmcgdG1wOwogICAgTiA9IHZlYzJhcnIobnVtcywgQSk7CiAgICBpbnQgTnpqOVkwa0U7CiAgICBjTHRyYWl0c190cnlfbWFrZV9zaWduZWQ8cmVtb3ZlX3JlZmVyZW5jZTxkZWNsdHlwZSgoKigoaW50KilOVUxMKSkpPjo6dHlwZT46OnR5cGUgYmt4T1B6UFg7CiAgICBpZihOPT0wKXsKICAgICAgYmt4T1B6UFggPSAwOwogICAgfQogICAgZWxzZXsKICAgICAgYmt4T1B6UFggPSBBWzBdOwogICAgICBmb3IoTnpqOVkwa0U9KDEpO056ajlZMGtFPChOKTtOemo5WTBrRSsrKXsKICAgICAgICBia3hPUHpQWCA9IG1heF9MKGJreE9QelBYLCBBW056ajlZMGtFXSk7CiAgICAgIH0KICAgIH0KICAgIHRtcCA9Ymt4T1B6UFg7CiAgICBpZih0bXAgPD0gMCl7CiAgICAgIHJldHVybiB0bXA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgQVtpXSAtPSBpOwogICAgfQogICAgc29ydEFfaW5kZXgoTiwgQSwgaW5kKTsKICAgIHQud2FsbG9jKE4sIDEpOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGlmKGluZFtpXT4wKXsKICAgICAgICBjaG1heChyZXMsIHRtcCA9dC5nZXRNYXhWYWwoMCwgaW5kW2ldKSsgQVtpXSArIGluZFtpXSk7CiAgICAgIH0KICAgICAgZWxzZXsKICAgICAgICBjaG1heChyZXMsIHRtcCA9MCsgQVtpXSArIGluZFtpXSk7CiAgICAgIH0KICAgICAgaWYodG1wID4gMCl7CiAgICAgICAgdC5jaGFuZ2UoaW5kW2ldLCB0bXApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KfQo7Ci8vIGNMYXkgdmVyc2lvbiAyMDIzMTAzMS0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIGxsIG1heEJhbGFuY2VkU3Vic2VxdWVuY2VTdW0oVkkgJm51bXMpIHsKLy8gICAgIGR1bW15X21haW4oKTsKLy8gICAgIHN0YXRpYyBpbnQgTiwgQVsxZDVdLCBpbmRbXTsKLy8gICAgIHNlZ3RyZWVfUG9pbnRfTWF4dmFsPGxsPiB0OwovLyAgICAgbGwgcmVzID0gMCwgdG1wOwovLyAKLy8gICAgIE4gPSB2ZWMyYXJyKG51bXMsIEEpOwovLyAgICAgdG1wID0gbWF4KEEoTikpOwovLyAgICAgaWYodG1wIDw9IDApIHJldHVybiB0bXA7Ci8vIAovLyAgICAgcmVwKGksTikgQVtpXSAtPSBpOwovLyAgICAgc29ydEFfaW5kZXgoTiwgQSwgaW5kKTsKLy8gICAgIHQud2FsbG9jKE4sIDEpOwovLyAKLy8gICAgIHJlcChpLE4pewovLyAgICAgICByZXMgPj89IHRtcCA9IGlmW2luZFtpXT4wLCB0LmdldE1heFZhbCgwLCBpbmRbaV0pLCAwXSArIEFbaV0gKyBpbmRbaV07Ci8vICAgICAgIGlmKHRtcCA+IDApIHQuY2hhbmdlKGluZFtpXSwgdG1wKTsKLy8gICAgIH0KLy8gCi8vICAgICByZXR1cm4gcmVzOwovLyAgIH0KLy8gfTsK