#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; int a[10001]; int b[10001]; vector V[10001]; int euler[3*10001]; int nivel[3*200001]; bitset<40001> used; bitset<40001> usedServer; int dista[301][301]; int dmin[301][301]; int auxn; int rmq[3*10001][24]; int loog[3*10001]; int f[3*10001]; int nivell[10001]; void create_euler(int nod,int niv) { euler[++auxn] = nod; f[nod] = auxn; nivell[nod] = niv; nivel[auxn] = niv; used[nod] = true; for(vector::iterator it = V[nod].begin(); it != V[nod].end(); it++) if(!used[*it]) { create_euler(*it,niv+1); euler[++auxn] = nod; nivel[auxn] = niv; } } int LCA(int x, int y) { x = f[x],y = f[y]; if(x > y) swap(x,y); int l = loog[y-x+1]; if(nivel[rmq[x][l]] < nivel[rmq[y - (1<>n>>k; for(int i = 1; i <= k; i++) cin>>a[i]; for(int j = 1; j <= k; j++) cin>>b[j]; int x,y; for(int i = 1; i < n;i ++) { cin>>x>>y; V[x].push_back(y); V[y].push_back(x); } create_euler(1,0); int nn = n; n = auxn; for(int i=1;i<=n;i++) { rmq[i][0] = i; if(i>1) loog[i] = 1+loog[i>>1]; } for(int j=1;(1<= 1; j--) if(dmin[i][j+1] < dmin[i][j]) dmin[i][j] = dista[i][j]; int solutieL = 1; for(int i = 1; i<=k;i++ ) { int ind = 0; int diff = 999999; for(int j = 1; j<=k;j++) if(!usedServer[j] && dista[i][j] - dmin[i][j] < diff) { diff = dista[i][j] - dmin[i][j]; solutieL = max(solutieL, dista[i][j]); ind = i; } usedServer[ind] = true; } cout<