#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<string>
#include<cmath>
#include<set>
using namespace std;
int n,m;
vector<int> Adj[300005];
bool vis[300005];
set<int,greater<int> > q[300005];
void dfs(int x,int dep,int fa){
if(*q[x].begin()>=1) vis[x]=1;
for(int i=0;i<Adj[x].size();++i){
int v=Adj[x][i],XX;
if(q[x].size()!=0) XX=dep+*q[x].begin();
else XX=dep;
if(fa!=v&&XX!=0){
vis[v]=1;
dfs(v,XX-1,x);
}
}
}
int main(){
cin>>n>>m;
int flag=0;
for(int i=2;i<=n;++i){
int x;
cin>>x;
if(x==1) flag=1;
Adj[x].push_back(i);
}
for(int i=1;i<=m;++i){
int x,y;
cin>>x>>y;
q[x].insert(y);
}
if(flag!=1){
while(1){
int x;
}
}
dfs(1,0,0);
int cnt=0;
for(int i=1;i<=n;++i){
cnt+=vis[i];
}
cout<<cnt;
return 0;
}