#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
node *l=NULL,*r=NULL,*fa=NULL;
ll val;
ll sons=0,sum=0;bool lazy_tag=0;
}splays[100005];
ll operation(ll a,ll b){return a^b;}
bool is_root(node* n){
if(n->fa==NULL)return 1;
if(n!=n->fa->l&&n!=n->fa->r)return 1;
return 0;
}
void updata(node* u){
u->sons=1+(u->l?u->l->sons:0)+(u->r?u->r->sons:0);
u->sum=operation(u->val,operation((u->l?u->l->sum:0),(u->r?u->r->sum:0)));
}
void push_down(node* u){
if(u->lazy_tag){
swap(u->l,u->r);
u->lazy_tag=0;
if(u->l)u->l->lazy_tag=!(u->l->lazy_tag);
if(u->r)u->r->lazy_tag=!(u->r->lazy_tag);
}
}
ll get_direction(node* u){//0是l,1是r,-1代表u是树根
if(u->fa==NULL)return -1;
if(u->fa->l==u)return 0;
if(u->fa->r==u)return 1;
}
node* get_this_splay_root(node* u){
return (is_root(u)?u:get_this_splay_root(u->fa));
}
void all_push(node* u){
if(!is_root(u))all_push(u->fa);
push_down(u);
}
void rotate(node* u){
node* f=u->fa,*g=u->fa->fa;
bool l_or_r=get_direction(u);
if(!l_or_r){
f->l=u->r;
if(f->l)f->l->fa=f;
}else{
f->r=u->l;
if(f->r)f->r->fa=f;
}
f->fa=u;
if(!l_or_r)u->r=f;
else u->l=f;
u->fa=g;
if(g){
if(g->l==f)g->l=u;
else g->r=u;
}
updata(f);
updata(u);
}
void splay(node* u){
all_push(u);
while(!is_root(u)){
if(!is_root(u->fa)){
if(get_direction(u)==get_direction(u->fa))rotate(u->fa);
else rotate(u);
}
rotate(u);
}
}
void access(node* u){
node* u2=u;
for(node* x=NULL;u;x=u,u=u->fa){
splay(u);
u->r=x;
updata(u);
}
splay(u2);
}
void make_root(node* u){
access(u);
u->lazy_tag^=1;
}
node* find_root(node* u){
access(u);
while(u->l)u=u->l;
return u;
}
void link(node* u,node* v){
if(find_root(u)!=find_root(v)){
make_root(u);
u->fa=v;
}
}
void split(node* u,node* v){
make_root(u);
access(v);
}
void cut(node* u,node* v){
split(u,v);
if(v->l==u && !u->r){ // 如果 u 是 v 的左子节点且 u 的右子节点为空
u->fa=v->l=NULL;
updata(u),updata(v);
}
}
ll sum(node* u,node* v){
split(u,v);
return v->sum;
}
void revise(node* u,ll val){
splay(u);
u->val=val;
updata(u);
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
ll n,m,u,x,y;
cin>>n>>m;
for(ll i=1;i<=n;i++){
cin>>splays[i].val;
splays[i].sum=splays[i].val;
}
while(m--){
cin>>u>>x>>y;
if(u==0)cout<<sum(splays+x,splays+y)<<'\n';
if(u==1)link(splays+x,splays+y);
if(u==2)cut(splays+x,splays+y);
if(u==3)revise(splays+x,y);
}
}
过了的点:1,2,3,10,12,13