#include using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair ii; typedef vector vi; typedef vector< ii > vii; #define INF 0x3F3F3F3F #define LINF 0x3F3F3F3F3F3F3F3FLL #define pb push_back #define mp make_pair #define pq priority_queue #define LSONE(s) ((s)&(-s)) //LASTBIT #define DEG_to_RAD(X) (X * PI / 180) #define F first #define S second #ifdef ONLINE_JUDGE #define debug(args...) #else #define debug(args...) fprintf(stderr,args) #endif ////////////////////// int dx[] = {1,-1,0,0}; int dy[] = {0,0,-1,1}; ////////////////////// const int N = 10011; const int M = 18; int n,k; int a[N],b[N]; vi g[N]; int lca[M][N]; int depth[N]; void dfs( int x = 1, int ult = 0, int prof = 0 ) { depth[x] = prof; lca[0][x] = ult; for(int i=0;i=0;--i) if( lca[i][a] != lca[i][b] ) a = lca[i][a], b = lca[i][b]; return lca[0][a]; } int get_dist( int a, int b ) { if( a == b ) return 0; if( depth[a] < depth[b] ) swap(a,b); int l = get_anc(a,b); return depth[a]+depth[b]-2*depth[l]; } int cost[310][310]; int flow[610][610]; int p[610], vis[610]; vi graph[610]; int s,t; int bfs() { memset(vis,0,sizeof vis); memset(p,-1,sizeof p); queueq; q.push(s); vis[s] = 1; while(!q.empty()) { int x = q.front(); q.pop(); for(int i=0;i 1 ) { int mid = (lo+hi)>>1; if( !test(mid) ) lo = mid; else hi = mid; } int resp = INF; if( test(hi) ) resp = min( resp, hi ); if( test(lo) ) resp = min( resp, lo ); printf("%d\n",resp); return 0; }