对于10% 的数据,没有断边操作
对于40% 的数据,n<=1000; m<= 500
对于100% 的数据,n <= 200000; m <= 200000,0 < 点上的权值 <=1000
var
a,b,c,i,j,i1,j1,k,lastans:longint;
v,fa:array[1..200000]of longint;
function get(i:longint):longint;
begin
if fa[i]=i then
exit(i)
else
exit(get(fa[i]));
end;
begin
readln(a,b);
for c:=1 to a do
readln(v[c]);
for c:=1 to a do
fa[c]:=c;
for c:=1 to a-1 do
begin
readln(i,j);
i1:=get(i);
j1:=get(j);
if i1<>j1 then
begin
if fa[i]=i then
fa[i]:=j
else
fa[j]:=i;
end;
end;
lastans:=0;
for c:=1 to b do
begin
readln(i,j,k);
j:=j xor lastans;
k:=k xor lastans;
if i=1 then
begin
if fa[j]=k then
fa[j]:=j;
if fa[k]=j then
fa[k]:=k;
end;
if i=2 then
begin
i1:=get(j);
j1:=get(k);
if i1=j1 then
begin
writeln(v[j]*v[k]);
lastans:=v[j]*v[k];
end;
if i1<>j1 then
begin
writeln(v[j]+v[k]);
lastans:=v[j]+v[k];
end;
end;
if i=3 then
begin
v[j]:=k;
end;
end;
end.