MLE #5
#include<bits/stdc++.h>
using namespace std;
int t;
int n;
int a[214514];
int m[214514];
int h[214514],e[414514],ne[414514],idx;
int ans,inf=1e9;
struct Node
{
int u,d;
} d[214514];
inline void add(int a,int b)
{
idx++;
ne[idx]=h[a];
e[idx]=b;
h[a]=idx;
}
void dfs(int x)
{
int opx=0,opn=0,gen=0;
for(int i=h[x];i;i=ne[i])
{
int y=e[i];
dfs(y);
opx=max(opx,d[y].u);
opn=max(opn,d[y].d);
gen++;
}
if(a[x]==-1)
{
if(gen==1)
d[x]={opx,opn};
else if(gen>1)
d[x]={min(inf,opx),opn+1};
}
else
{
if(gen==1)
{
if(d[x].u<opn)
ans=0;
else if(d[x].d>opx)
ans=0;
}
else if(gen>1)
{
//cout<<x<<' '<<d[x].u<<' '<<opn<<' '<<opx<<'\n';
if(d[x].u<opn+1)
ans=0;
else if(d[x].d>opx+1)
ans=0;
}
}
//m[x]=max(m[x],a[x]);
//cout<<x<<' '<<gen<<' '<<op<<' '<<m[x]<<' '<<a[x]<<'\n';
}
int main()
{
cin>>t;
while(t--)
{
for(int i=1;i<=idx;i++)
h[i]=0;
ans=1;idx=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]==-1)
d[i]={inf,0};
else
d[i]={a[i],a[i]};
}
for(int i=1;i<=n-1;i++)
{
int a,b;
cin>>a>>b;
add(a,b);
}
dfs(1);
if(ans)
cout<<"Reasonable"<<'\n';
else
cout<<"Unreasonable"<<'\n';
}
return 0;
}