#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace acac
{
struct node
{
int ls,rs,v,rt,dis,add,tag,sz;
}reap[600010];
void pu(int u)
{
reap[u].sz=reap[reap[u].ls].sz+reap[reap[u].rs].sz+1;
}
void cf(int u,int tag)
{
reap[u].v*=tag;
reap[u].add*=tag;
reap[u].tag*=tag;
}
void jf(int u,int tag)
{
reap[u].v+=tag;
reap[u].add+=tag;
}
void pd(int u)
{
if(reap[u].tag>1)
{
cf(reap[u].ls,reap[u].tag),cf(reap[u].rs,reap[u].tag);
reap[u].tag=1;
}
if(reap[u].add)
{
jf(reap[u].ls,reap[u].add),jf(reap[u].rs,reap[u].add);
reap[u].add=0;
}
}
int me(int x,int y)
{
if(x*y==0)return x+y;
if(reap[x].v>reap[y].v)swap(x,y);
pd(x);
reap[x].rs=me(reap[x].rs,y);
if(reap[reap[x].ls].dis<reap[reap[x].rs].dis)swap(reap[x].ls,reap[x].rs);
reap[x].dis=reap[reap[x].rs].dis+1;
pu(x);
return x;
}
void del(int &u)
{
u=me(reap[u].ls,reap[u].rs);
}
int belong(int u)
{
if(reap[u].rt!=u)return reap[u].rt=u;
return u;
}
int die[300010],st[300010],dep[300010],def[300010],bh[300010][5],ans[300010];
int n,m;
struct edge
{
int to,ne;
}e[300010];
int H[300010];
int cnt;
void add(int a,int b)
{
e[++cnt].to=b;
e[cnt].ne=H[a];
H[a]=cnt;
}
void dfs(int u,int fa)
{
dep[u]=dep[fa]+1;
for(int i=H[u];i;i=e[i].ne)
{
int v=e[i].to;
dfs(v,u);
reap[u].rt=me(reap[u].rt,reap[v].rt);
}
// cout<<u<<' ';
// for(int i=n+1;i<=n+m;i++)
// {
// cout<<reap[i].v<<' ';
// }
// cout<<endl;
while(reap[reap[u].rt].sz&&reap[reap[u].rt].v<def[u])
{
ans[u]++;
die[reap[u].rt-n]=u;
// cout<<u<<' '<<reap[u].rt<<' '<<reap[reap[u].rt].v<<endl;
pd(reap[u].rt);
del(reap[u].rt);
}
if(u==1)return ;
if(!reap[reap[u].rt].sz)return ;
if(bh[u][0])cf(reap[u].rt,bh[u][1]);
else jf(reap[u].rt,bh[u][1]);
pd(reap[u].rt);
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&def[i]);
}
for(int i=2;i<=n;i++)
{
int f;
scanf("%lld%lld%lld",&f,&bh[i][0],&bh[i][1]);
reap[i].tag=1;
reap[i].rt=i;
add(f,i);
}
reap[0].dis=-1;
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&reap[i+n].v,&st[i]);
reap[i+n].tag=1;
reap[i+n].sz=1;
reap[i+n].rt=i+n;
if(!reap[reap[st[i]].rt].sz)reap[st[i]].rt=i+n;
else reap[st[i]].rt=me(reap[st[i]].rt,i+n);
}
// for(int i=1;i<=n+m;i++)
// {
// cout<<i<<' '<<reap[i].ls<<' '<<reap[i].rs<<' '<<reap[i].rt<<' '<<reap[i].sz<<endl;
// }
dfs(1,0);
for(int i=1;i<=n;i++)
{
cout<<ans[i]<<'\n';
}
for(int i=1;i<=n;i++)
{
cout<<dep[st[i]]-dep[die[i]]<<'\n';
}
return 0;
}
}
#undef int
int main()
{
acac::main();
return 0;
}