#include "testlib.h" #include using namespace std; using ll = long long; using pll = pair; struct UnionFind{ vector par; UnionFind(int n) : par(n, -1) {} int find(int x){ if(par[x] < 0) return x; return par[x] = find(par[x]); } bool merge(int x, int y){ x = find(x); y = find(y); if(x == y) return false; if(par[x] > par[y]) swap(x, y); par[x] += par[y]; par[y] = x; return true; } bool same(int x, int y){ return find(x) == find(y); } }; const int N_MIN = 2, N_MAX = 100000; const int A_MIN = 1, A_MAX = 1'000'000'000; int main(){ registerValidation(); int N = inf.readInt(N_MIN, N_MAX); inf.readEoln(); vector A = inf.readInts(N, A_MIN, A_MAX); inf.readEoln(); UnionFind uf(N); vector b = inf.readInts(N - 1, A_MIN, A_MAX); inf.readEoln(); vector c = inf.readInts(N - 1, A_MIN, A_MAX); inf.readEoln(); vector p = inf.readInts(N - 1, 1, N); inf.readEoln(); for(int i = 1; i < N; i++){ ensure(p[i-1] <= i); ensure(!uf.same(i, p[i-1]-1)); uf.merge(i, p[i-1]-1); ensure(b[i-1] <= A[i]); ensure(c[i-1] <= A[p[i-1]-1]); } inf.readEof(); return 0; }