// Olimpíadas Nacionais de Informática 2020 // Treino #01: Problema F - Festa de Aniversário // Transcrição da solução oficial (convertida de C++ para Java) import java.util.*; class Interval { int lo, hi; Interval(int l, int h) { lo = l; hi = h; } } class f { //#define lo first //#define hi second static final int MAXN = 10010; static final int MAXK = 110; static int n, v[]; static Vector> e = new Vector<>(); static Vector> s = new Vector<>(); static Vector> q = new Vector<>(); static BitSet[][] flag; static void dfs(int x) { for (int y : e.get(x)) dfs(y); for (int i = 0; i < MAXK; ++i) q.get(i).clear(); for (int y : e.get(x)) { for (Interval it : s.get(y)) q.get(it.lo).add(it.hi); } for (int lo = MAXK - 1; lo >= 1; --lo) { if (lo == v[x]) { flag[x][lo].or(flag[x][lo + 1]); flag[x][lo].set(lo); } else { for (int hi : q.get(lo)) { if (hi < v[x] || lo > v[x]) { flag[x][lo].or(flag[x][hi + 1]); flag[x][lo].set(hi); } } } for (int hi = MAXK - 1; hi >= lo; --hi) if (flag[x][lo].get(hi) && v[x] >= lo && v[x] <= hi) { s.get(x).add(new Interval(lo, hi)); } } } static void init() { Scanner in = new Scanner(System.in); n = in.nextInt(); flag = new BitSet[n][MAXK]; for (int i=0; i()); for (int i=0; i()); for (int i=0; i()); v = new int[n]; for (int i = 0; i < n; ++i) v[i] = in.nextInt(); for (int i = 0; i < n - 1; ++i) { int a = in.nextInt(); int b = in.nextInt(); --a; --b; e.get(a).add(b); } } static void solve() { dfs(0); System.out.println(s.get(0).size()); } public static void main(String[] args) { init(); solve(); } }