#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int N = 2e5+5 ;
const int M = 2005 ; // 2e5+5 ;
const int Q = 2005 ; // 2e5+5 ;
int n , m , q , arr[M] , deep[N] , anc[N][(int)log2(N)+5] ;
ll opi[M] ;
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 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] ;
}
while(q--){
char ch ; cin >> ch ;
if(ch=='t'){
int l , r , c ; cin >> l >> r >> c ;
for(int i=l ; i<=r ; i++){
int lca = flca(arr[i],c) ;
opi[i]-=deep[arr[i]]+deep[c]-2*deep[lca] ;
arr[i]=c ;
}
}
else if(ch=='e'){
int c , d ; cin >> c >> d ;
for(int i=1 ; i<=m ; i++){
if(arr[i]==c) opi[i]+=d ;
}
}
else{
int v ; cin >> v ;
cout << opi[v] << '\n' ;
}
}
return 0 ;
}