#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int N = 2e5+5 ;
const int M = 2e5+5 ;
const int Q = 2e5+5 ;
int n , m , q , arr[M] , deep[N] , anc[N][(int)log2(N)+5] , seg[4*N] ;
ll opi[4*N] ;
vector<int> nei[N] ;
void dfs(int node){
for(int i:nei[node]){
if(i==anc[node][0]) continue ;
deep[i] = deep[node]+1 ; anc[i][0] = node ; dfs(i) ;
}
}
int flca(int a , int b){
if(deep[a]<deep[b]) swap(a,b) ;
int diff = deep[a]-deep[b] ;
for(int i=0 ; i<=log2(n)+1 ; i++){
if((diff>>i)&1) a = anc[a][i] ;
}
if(a==b) return a ;
for(int i=log2(n)+1 ; i>=0 ; i--){
if(anc[a][i]!=anc[b][i]) a = anc[a][i] , b = anc[b][i] ;
}
return anc[a][0] ;
}
int fdis(int a , int b){
int lca = flca(a,b) ;
return deep[arr[a]]+deep[b]-2*deep[lca] ;
}
void f(int le , int ri , int v , int l , int r , int x){
if(r<le || ri<l) return ;
else if(l<=le && ri<=r && seg[v]!=-1){ opi[v] -= fdis(seg[v],x) ; seg[v] = x ; return ; }
int mi = (le+ri)/2 ;
f(le,mi,v<<1,l,r,x) ; f(mi+1,ri,(v<<1)|1,l,r,x) ;
}
ll g(int le , int ri , int v , int target){
if(target<le || ri<target) return 0 ;
else if(le==target && ri==target) return opi[v] ;
int mi = (le+ri)/2 ;
return opi[v] + g(le,mi,v<<1,target) + g(mi+1,ri,(v<<1)|1,target) ;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) ;
cin >> n >> m >> q ;
for(int i=1 ; i<=m ; i++) cin >> arr[i] ;
for(int i=1 ; i<n ; i++){
int a , b ; cin >> a >> b ;
nei[a].push_back(b) ; nei[b].push_back(a) ;
}
dfs(1) ;
for(int j=1 ; j<=log2(n)+1 ; j++){
for(int i=1 ; i<=n ; i++) anc[i][j]=anc[anc[i][j-1]][j-1] ;
}
memset(seg,0,sizeof(seg)) ;
for(int i=1 ; i<=n ; i++) f(1,n,1,i,i,arr[i]) ;
while(q--){
char ch ; cin >> ch ;
if(ch=='t'){
int l , r , c ; cin >> l >> r >> c ;
f(1,n,1,l,r,c) ;
}
else if(ch=='e'){
int c , d ; cin >> c >> d ;
;
}
else{
int v ; cin >> v ;
cout << g(1,n,1,v) << '\n' ;
}
}
return 0 ;
}