Pagini recente » Cod sursa (job #254741) | Cod sursa (job #571413) | Cod sursa (job #838415) | Cod sursa (job #2482363) | Cod sursa (job #2369837)
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;
int n,x,y;
int c[200005];
vector <int> g[200005];
vector <int> sir, aux;
bitset<200005> viz;
int rez = 0;
int cautBin(int val){
int st=1, dr=aux.size()-1;
while(st<=dr){
if(st==dr)
return st;
int mij = (st+dr)/2;
if(val<aux[mij])
st = mij+1;
else
dr = mij;
}
return -1;
}
void scmax(){
aux.clear();
aux.push_back(1e9+5);
for(int i : sir){
if(c[i]<aux.back())
aux.push_back(c[i]);
else{
int poz = cautBin(c[i]);
aux[poz] = c[i];
}
}
//int s = aux.size()-1;
rez = max(rez, (int)aux.size()-1);
}
void dfs(int nod){
viz[nod]=1;
sir.push_back(nod);
for(int i:g[nod])
if(!viz[i])
dfs(i);
if(nod!=1 && g[nod].size()==1)
scmax(), sir.pop_back();
}
int main()
{
freopen("guvern.in","r",stdin);
freopen("guvern.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<n;++i){
scanf("%d%d", &x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
for(int i=1;i<=n;++i)
scanf("%d", &c[i]);
dfs(1);
cout<<rez;
return 0;
}