#include
#include
#include
#include
#include
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long ll;
const int N=50005;
int siz[N],top[N],son[N],dep[N],tid[N],rk[N],fa[N];
int cnt,tim,n,m,p,a[N];
struct node
{
int next,to;
} edge[N*2];
int head[N];
void intt()
{
cnt=tim=0;
memset(son,-1,sizeof(son));
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
edge[++cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
void dfs1(int u,int pre,int de)
{
dep[u]=de;fa[u]=pre;siz[u]=1;
for(int i=head[u]; ~i; i=edge[i].next)
{
int v=edge[i].to;
if(v!=pre)
{
dfs1(v,u,de+1);
siz[u]+=siz[v];
if(son[u]==-1||siz[v]>siz[son[u]])
son[u]=v;
}
}
}
void dfs2(int u,int tp)
{
top[u]=tp;
tid[u]=++tim;
rk[tid[u]]=u;
if(son[u]==-1) return;
dfs2(son[u],tp);
for(int i=head[u]; ~i; i=edge[i].next)
{
int v=edge[i].to;
if(v!=son[u]&&v!=fa[u])
dfs2(v,v);
}
}
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
int sum[4*N],lazy[4*N];
void up(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void down(int rt,int len)
{
if(lazy[rt])
{
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
sum[rt<<1]+=lazy[rt]*(len-(len>>1));
sum[rt<<1|1]+=lazy[rt]*(len>>1);
lazy[rt]=0;
}
}
void build(int l,int r,int rt)
{
lazy[rt]=0;
if(l==r)
{
sum[rt]=a[rk[l]];
return;
}
int mid=(l+r)>>1;
build(ls);
build(rs);
up(rt);
}
void update(int L,int R,int val,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
lazy[rt]+=val;
sum[rt]+=val*(r-l+1);
return;
}
down(rt,r-l+1);
int mid=(l+r)>>1;
if(mid>=L) update(L,R,val,ls);
if(midint query(int pos,int l,int r,int rt)
{
if(l==r) return sum[rt];
down(rt,r-l+1);
int mid=(l+r)>>1;
int ret=0;
if(pos<=mid) ret+=query(pos,ls);
else ret+=query(pos,rs);
return ret;
}
void Change(int x,int y,int val)
{
while(top[x]!=top[y])
{
if(dep[top[x]]1,n,1);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
update(tid[x],tid[y],val,1,n,1);
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&p))
{
intt();
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
}
dfs1(1,0,0);
dfs2(1,1);
build(1,n,1);
while(p--)
{
char oper[2];
int aa,b,c;
scanf("%s",oper);
if(oper[0]=='Q')
{
scanf("%d",&aa);
printf("%d\n",query(tid[aa],1,n,1));
}
else
{
scanf("%d%d%d",&aa,&b,&c);
if(oper[0]=='D') c=-c;
Change(aa,b,c);
}
}
}
}