#include <bits/stdc++.h>
using namespace std;
#define p push_back
const int N = 100000 + 5;
int n , q , in[N] , out[N] , val[N] , st[N][20] , dis[N] , vis[N] , lg[N] , t , rt = 1 , x , y;
int dfn[N];
char opt;
vector < int > g[N];
struct edge
{
int l , r , val;
} tree[N * 4 + 5];
void bfs()
{
queue < int > q;
memset(dis , -1 , sizeof(dis));
q.push(1);
dis[1] = 1;
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = 0 ; i < g[u].size() ; ++ i )
{
int v = g[u][i];
if(dis[v] == -1)
{
dis[v] = dis[u] + 1;
q.push(v);
}
}
}
}
void build(int p , int l , int r)
{
int lc = p << 1 , rc = p << 1 | 1;
tree[p].l = l , tree[p].r = r;
if(l == r)
{
tree[p].val = val[dfn[l]];
return ;
}
int mid = (l + r) >> 1;
build(lc , l , mid);
build(rc , mid + 1 , r);
tree[p].val = min(tree[lc].val , tree[rc].val);
}
void adde(int p , int x , int y)
{
int lc = p << 1 , rc = p << 1 | 1;
if(tree[p].l == tree[p].r)
{
tree[p].val += y;
return ;
}
int mid = (tree[p].l + tree[p].r) >> 1;
if(x <= mid) adde(lc , x , y);
else adde(rc , x , y);
tree[p].val = min(tree[lc].val , tree[rc].val);
}
int ask(int p , int l , int r)
{
int lc = p << 1 , rc = p << 1 | 1;
if(tree[p].l >= l && tree[p].r <= r)
{
return tree[p].val;
}
int mid = (tree[p].l + tree[p].r) >> 1;
int res = 0x3f3f3f3f;
if(l <= mid) res = min(res , ask(lc , l , r));
if(r > mid) res = min(res , ask(rc , l , r));
return res;
}
void dfs(int u , int fa)
{
in[u] = ++t;
dfn[t] = u;
for(int i = 0 ; i < g[u].size() ; ++ i )
{
int v = g[u][i];
if(v == fa) continue;
dfs(v , u);
}
out[u] = t;
}
void init()
{
bfs();
for(int i = 1 ; i < N ; ++ i ) lg[i] = lg[i >> 1] + 1;
for(int j = 1 ; (1 << j) < N ; ++ j )
{
for(int i = 1 ; i <= n ; ++ i )
{
st[i][j] = st[st[i][j - 1]][j - 1];
}
}
}
int check(int x)
{
if(dis[x] > dis[rt]) return 0;
int t = lg[dis[x] - dis[rt]] + 1;
int now = rt;
for(int i = t ; i ; -- i )
{
if(dis[now] - (1 << i) > dis[x]) now = st[now][i];
}
if(st[now][0] == x) return now;
else return 0;
}
int main()
{
cin >> n >> q;
for(int u = 1 ; u <= n ; ++ u )
{
int a , b;
cin >> a >> b;
st[u][0] = a;
val[u] = b;
if(a)
{
g[a].p(u);
g[u].p(a);
}
}
init();
dfs(1 , 0);
build(1 , 1 , n);
while(q--)
{
cin >> opt;
if(opt == 'V')
{
cin >> x >> y;
adde(1 , x , y - val[x]);
val[x] = y;
}
else if(opt == 'E')
{
cin >> x;
rt = x;
}
else
{
cin >> x;
if(x == rt)
{
cout << ask(1 , 1 , n) << endl;
}
else
{
int k = check(x);
if(k) cout << min(ask(1 , 1 , in[k] - 1) , ask(1 , out[k] + 1 , n)) << endl;
else cout << ask(1 , in[x] , out[x]) << endl;
}
}
}
return 0;
}