inlinevoidinsert( Treap * & rt , int key ){ int k = Getrank ( rt , key ) ; Drt t = Split ( rt , k ) ; Treap * node = new Treap ( key ) ; rt = merge ( t.first , merge ( node , t.second ) ) ; return ; }
intmain(){ scanf ("%d" , & n ) ; scanf ("%d" , & xx ) ; n -- ; ans = xx ; mk[xx] = true ; insert ( root , xx ) ; while ( n -- ) { scanf ("%d" , & xx ) ; if ( mk[xx] ) continue ; mk[xx] = true ; insert ( root , xx ) ; int a = abs ( Getkth ( root , Getrank ( root , xx ) ) - xx ) ; int b = abs ( Getkth ( root , Getrank ( root , xx + 1 ) + 1 ) - xx ) ; if ( a == 0 ) a = INF ; if ( b == 0 ) b = INF ; ans += std::min ( a , b ) ; } printf ("%d\n" , ans ) ; system ("pause") ; return0 ; }