Pagini recente » Cod sursa (job #335595) | Cod sursa (job #3164385) | Cod sursa (job #2514347) | Cod sursa (job #458562) | Cod sursa (job #1165425)
#include<iostream>
#include<fstream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
#define NMAX 200001
vector <int> v[NMAX],each[NMAX];
set <pair <int , int> > s;
int viz[NMAX],d[NMAX],val[NMAX];
void dfs(int nod)
{
viz[nod]=1;
s.insert(make_pair(val[nod],nod));
d[nod]=1;
for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++)
if(viz[*it]==0) {
each[nod].clear();
dfs(*it);
if(each[nod].begin()!=each[nod].end())
d[nod]=d[nod]+(*max_element(each[nod].begin(),each[nod].end()));
}
s.erase(make_pair(val[nod],nod));
set <pair <int, int> > :: iterator x = s.lower_bound(make_pair(val[nod],nod));
if(x!=s.end())
each[x->second].push_back(d[nod]);
}
int main()
{
int i,n,x,y;
ifstream f("guvern.in");
ofstream g("guvern.out");
f>>n;
for(i=1;i<=n-1;i++) {
f>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
for(i=1;i<=n;i++)
f>>val[i];
f.close();
dfs(1);
g<<*max_element(d+1,d+n+1);
g.close();
return 0;
}