Pagini recente » Camion2 | Statistici Barbu Ana (barbuana) | Cod sursa (job #2013479) | Diferente pentru onis-2014/runda-2 intre reviziile 16 si 20 | Cod sursa (job #2476056)
#include <fstream>
#include <vector>
#include <set>
#define DIM 200010
using namespace std;
ifstream fin ("guvern.in");
ofstream fout ("guvern.out");
vector <int> L[DIM];
set <int> s;
int t[DIM],v[DIM],maxi[DIM],is_ok[DIM];
int n,i,x,y;
int get_rad (int x){
while (t[x] > 0)
x = t[x];
return x;
}
void _union (int x, int y){
int radx = get_rad(x), rady = get_rad(y);
if (radx != rady){
if (t[radx] < t[rady]){
t[radx] += t[rady];
t[rady] = radx;
} else {
t[rady] += t[radx];
t[radx] = rady;
}}}
void dfs (int nod, int tata){
s.insert (v[nod]);
set <int> :: iterator it = s.lower_bound(v[nod]);
if (it != s.end()){
/// inseamna ca pe nod pot sa il leg de x
_union (nod,*it);
}
for (int i=0;i<L[nod].size();i++){
int vecin = L[nod][i];
if (vecin != tata)
dfs (vecin,nod);
}
s.erase(s.find(v[nod]));
}
int main (){
fin>>n;
for (i=1;i<n;i++){
fin>>x>>y;
L[x].push_back(y);
L[y].push_back(x);
}
for (i=1;i<=n;i++){
fin>>v[i];
t[i] = -1;
}
dfs (1,0);
int sol = 0;
for (i=1;i<=n;i++)
if (t[i] < 0)
sol = max (sol,-t[i]);
fout<<sol;
return 0;
}