#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int int64_t
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vector<pair<int, int>> o;
vector<int> h;
vector<vector<int>> p, g;
int in;
bool pa(int pp, int c){
if (o[pp].first<=o[c].first and o[c].second<=o[pp].second){
return true;
}
return false;
}
int lca(int v, int u, int ind){
if (v==u){
return u;
}
if (h[v]>h[u]){
swap(v, u);
}
if (pa(v, u)){
return v;
}
int pv=p[v][0];
if (pa(pv, u)){
return pv;
}
while (ind>=p[v].size()){
ind=p[v].size()-1;
}
while (pa(p[v][ind], u)){
ind--;
}
return lca(p[v][ind], u, ind);
}
void dfs(int v, int la){
if (la!=-1){
h[v]=h[la]+1;
}
o[v].first=in++;
p[v].push_back(la);
while (p[p[v][p[v].size()-1]].size()>=p[v].size()){
int a=p[v].size();
p[v].push_back(p[p[v][a]][a]);
}
for (auto u: g[v]){
if (u!=la){
dfs(u, v);
}
}
o[v].second=in++;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vector<int> stsc, stpo;
vector<array<int, 2>> stch;
int sts;
void pro(int v){
if (v>=sts){
return;
} else {
stsc[2*v]+=stsc[v];
stsc[2*v+1]+=stsc[v];
stsc[v]=0;
int a=stch[v][0];
if (a!=1e9){
stch[2*v][0]=a;
stch[2*v+1][0]=a;
}
a=stch[v][1];
if (a!=-1e9){
stch[2*v][1]=a;
stch[2*v+1][1]=a;
}
stch[v]={(int)1e9, (int)-1e9};
if (stpo[v]!=-1){
stpo[2*v]=stpo[v];
stpo[2*v+1]=stpo[2*v];
}
stpo[v]=-1;
}
}
void upo(int l, int r, int ql, int qr, int v, int va){
pro(v);
if (r<ql or qr<l){
return;
} else if (ql<=l and r<=qr){
stpo[v]=va;
} else {
upo(l, (l+r)/2, ql, qr, 2*v, va);
upo((l+r)/2+1, r, ql, qr, 2*v+1, va);
}
}
int qpo(int l, int r, int v, int i){
pro(v);
if (l==r and l==i){
return stpo[v];
} else if (i<l or i>r){
return 0;
} else {
return qpo(l, (l+r)/2, 2*v, i)+qpo((l+r)/2+1, r, 2*v+1, i);
}
}
void uch(int l, int r, int ql, int qr, int v, int cl, int cr){
pro(v);
if (r<ql or qr<l){
return;
} else if (ql<=l and r<=qr){
stch[v]={cl, cr};
} else {
uch(l, (l+r)/2, ql, qr, 2*v, cl, cr);
uch((l+r)/2+1, r, ql, qr, 2*v+1, cl, cr);
}
}
array<int, 2> qch(int l, int r, int v, int i){
pro(v);
if (l==r and l==i){
return stch[v];
} else if (i<l or i>r){
return {(int)1e9, (int)-1e9};
} else {
array<int, 2> a=qch(l, (l+r)/2, 2*v, i), b=qch((l+r)/2+1, r, 2*v+1, i), c;
c[0]=min(a[0], b[0]);
c[01]=max(a[1], b[1]);
return c;
}
}
void usc(int l, int r, int ql, int qr, int v, int va){
pro(v);
if (r<ql or qr<l){
return;
} else if (ql<=l and r<=qr){
stsc[v]+=va;
} else {
usc(l, (l+r)/2, ql, qr, 2*v, va);
usc((l+r)/2+1, r, ql, qr, 2*v+1, va);
}
}
int qsc(int l, int r, int v, int i){
pro(v);
if (l==r and l==i){
return stsc[v];
} else if (i<l or i>r){
return 0;
} else {
return qsc(l, (l+r)/2, 2*v, i)+qsc((l+r)/2+1, r, 2*v+1, i);
}
}
signed main(){
//cin.tie(0); ios_base::sync_with_stdio(NULL);
int n, m, q;
cin>>n>>m>>q;
sts=1<<(int)ceil(log2(m));
stch.assign(2*sts, {(int)1e9, (int)-1e9});
stsc.assign(2*sts, 0);
for (int i=sts; i<sts+m; i++){
stch[i]={i-sts, i-sts};
}
stpo.assign(2*sts, -1);
for (int i=sts; i<sts+m; i++){
int a;
cin>>a;
a--;
stpo[i]=a;
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
in=0;
o.resize(n);
h.assign(n, 0);
p.resize(n);
g.resize(n);
for (int i=0; i<n-1; i++){
int a, b;
cin>>a>>b;
a--;
b--;
g[a].push_back(b);
g[b].push_back(a);
}
dfs(0, -1);
int mind=100;
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
for (int i=0; i<q; i++){
char cha;
cin>>cha;
if (cha=='q'){
int x;
cin>>x;
x--;
cout<<qsc(0, sts-1, 1, x)<<"\n";
continue;
}
int x, y, w;
cin>>x>>y>>w;
x--;
y--;
w--;
if (x!=0){
int xx=qch(0, sts-1, 1, x-1)[0];
uch(0, sts-1, xx, x-1, 1, xx, x-1);
}
if (y!=m-1){
int yy=qch(0, sts-1, 1, y+1)[1];
uch(0, sts-1, y+1, yy, 1, y+1, yy);
}
int inde=x;
while (inde<=y){
/*for (auto u: stch){
cout<<u[1]<<" ";
}
cout<<"\n";*/
int le=inde, ri;
int aaa=qch(0, sts-1, 1, inde)[1];
ri=min(aaa, y);
//cout<<i<<": "<<aaa<<" "<<x<<" "<<y<<" "<<le<<" "<<ri<<"\n";
int poo=qpo(0, sts-1, 1, le);
int an=lca(poo, w, mind);
int dsc=h[poo]+h[w]-2*h[an];
usc(0, sts-1, le, ri, 1, -dsc);
inde=ri+1;
}
uch(0, sts-1, x, y, 1, x, y);
upo(0, sts-1, x, y, 1, w);
}
}