#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
/*
ll ret; char ch; bool fh;
inline ll rd() {
for(fh=0,ch=getchar();ch<'0'||ch>'9';ch=getchar()) {
if(ch=='-') fh=1;
}
for(ret=0;ch>='0'&&ch<='9';ch=getchar()) {
ret=(ret<<1)+(ret<<3)+ch-'0';
}
return fh?-ret:ret;
}
*/
const int N=3e5+5;
int n,m,cnt,dis[N],d[N],ls[N],rs[N],rt[N],ans[N],Ans[N],fro[N];
ll h[N],t1[N],t2[N],a[N],op[N];
vector<int>V[N];
struct A{ int id; ll x; }c[N];
inline int New(A x) {
ls[++cnt]=rs[cnt]=d[cnt]=t1[cnt]=0,t2[cnt]=1,c[cnt]=x;
return cnt;
}
inline void Tim(int p,ll x) {
if(p) c[p].x*=x,t1[p]*=x,t2[p]*=x;
}
inline void Add(int p,ll x) {
if(p) c[p].x+=x,t1[p]+=x;
}
inline void down(int p) {
if(t2[p]!=1) {
Tim(ls[p],t2[p]),Tim(rs[p],t2[p]),t2[p]=1;
}
if(t1[p]!=0) {
Add(ls[p],t1[p]),Add(rs[p],t1[p]),t1[p]=0;
}
}
int merge(int u,int v) {
if(!u||!v) return u|v;
down(u),down(v);
if(c[u].x>c[v].x) swap(u,v);
rs[u]=merge(rs[u],v);
if(d[rs[u]]>d[ls[u]]) swap(ls[u],rs[u]);
d[u]=d[rs[u]]+1;
return u;
}
void dfs(int u) {
for(auto v:V[u]) {
dfs(v);
rt[u]=merge(rt[u],rt[v]);
}
for(down(rt[u]);rt[u]&&c[rt[u]].x<h[u];rt[u]=merge(ls[rt[u]],rs[rt[u]]),down(rt[u])) {
Ans[c[rt[u]].id]=dis[fro[c[rt[u]].id]]-dis[u];
ans[u]++;
}
if(u!=1){
if(op[u]) Tim(rt[u],a[u]);
else Add(rt[u],a[u]);
} else {
for(;rt[u];rt[u]=merge(ls[rt[u]],rs[rt[u]])) {
Ans[c[rt[u]].id]=dis[fro[c[rt[u]].id]];
}
}
}
queue<int>Q;
inline void bfs() {
Q.push(1); dis[1]=1;
while(!Q.empty()) {
int u=Q.front(); Q.pop();
for(auto v:V[u]) {
dis[v]=dis[u]+1,Q.push(v);
}
}
}
signed main(){
d[0]=-1;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&h[i]);
for(int i=2;i<=n;i++) {
int u; scanf("%lld%lld%lld",&u,&op[i],&a[i]);
V[u].push_back(i);
}
for(int i=1;i<=m;i++) {
ll u,v; scanf("%lld%lld",&u,&v);
rt[v]=merge(rt[v],New((A){i,u}));
fro[i]=v;
}
bfs();
dfs(1);
for(int i=1;i<=n;i++) printf("%lld\n",ans[i]);
for(int i=1;i<=m;i++) printf("%lld\n",Ans[i]);
return 0;
}
BZOJ数据全过了,但luogu的死活过不去