#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, x, id, l[400005], r[400005], fa[400005], ans[400005], vis[400005][3];
struct node{
int x, id;
};
stack<node> st;
vector<int> v[400005];
void init(){
for(int i = 1; i <= n; i++){
fa[i] = i;
ans[i] = -1;
}
}
int find(int x){
if(fa[x] == x){
return x;
}
return fa[x] = find(fa[x]);
}
void dfs(int cur){
ans[cur] = st.size();
for(auto i : v[cur]){
if(ans[i] != -1){
continue;
}
else{
dfs(i);
}
}
}
void unionn(int x, int y){
if(find(x) == 1){
dfs(y);
fa[find(y)] = find(x);
}
else if(find(y) == 1){
dfs(x);
fa[find(x)] = find(y);
}
else{
fa[find(x)] = find(y);
}
}
signed main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> l[i] >> r[i];
}
init();
for(int i = 1; i <= m; i++){
cin >> x >> id;
vis[x][id] = 1;
st.push({x, id});
}
for(int i = 1; i <= n; i++){
if(!vis[i][1] && l[i] != -1){
unionn(i, l[i]);
v[i].push_back(l[i]);
v[l[i]].push_back(i);
}
if(!vis[i][2] && r[i] != -1){
unionn(i, r[i]);
v[r[i]].push_back(i);
v[i].push_back(r[i]);
}
}
while(!st.empty()){
x = st.top().x, id = st.top().id;
st.pop();
if(id == 1){
if(find(x) == find(l[x])){
continue;
}
unionn(x, l[x]);
v[x].push_back(l[x]);
v[l[x]].push_back(x);
}
else{
if(find(x) == find(r[x])){
continue;
}
unionn(x, r[x]);
v[x].push_back(r[x]);
v[r[x]].push_back(x);
}
}
for(int i = 1; i <= n; i++){
cout << ans[i] << "\n";
}
return 0;
}