#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define xx return
#define int long long
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i++)
const int N=5e5;
int n,m,q;
int a[N+5];
struct Tree{
int left,right,up;
#define left(x) t[x].left
#define right(x) t[x].right
#define up(x) t[x].up
}t[N*4+5];
Tree operator + (Tree a,Tree b)
{
Tree res;
res.up=(a.up>>b.right)<<b.left|b.up;
res.left=b.left+max(a.left-b.right,0ll);
res.right=a.right+max(b.right-a.left,0ll);
xx res;
}
void build(int p,int l,int r)
{
if(l==r)
{
if(a[l]==1)t[p]=Tree{1,0,0};
else if(a[l]==2)t[p]=Tree{1,0,1};
else t[p]=Tree{0,1,0};
xx;
}
int mid=l+r>>1;
build(p*2,l,mid),build(p*2+1,mid+1,r);
t[p]=t[p*2]+t[p*2+1];
}
void change(int p,int l,int r,int x,int val)
{
if(l==r)
{
if(val==1)t[p]=Tree{1,0,0};
else if(val==2)t[p]=Tree{1,0,1};
else t[p]=Tree{0,1,0};
xx;
}
int mid=l+r>>1;
if(x<=mid)change(p*2,l,mid,x,val);
if(x>mid)change(p*2+1,mid+1,r,x,val);
t[p]=t[p*2]+t[p*2+1];
}
Tree ask(int p,int l,int r,int L,int R,Tree &k)
{
if(L<=l&&r<=R)xx (k=k+t[p]);
int mid=l+r>>1;
if(L<=mid)ask(p*2,l,mid,L,R,k);
if(mid<R)ask(p*2+1,mid+1,r,L,R,k);
t[p]=t[p*2]+t[p*2+1];
}
void solve()
{
scanf("%lld%lld%lld",&n,&m,&q);
rep(i,1,m)scanf("%lld",&a[i]);
build(1,1,m);
while(q--)
{
int op;scanf("%lld",&op);
if(op==1){
int s,l,r;scanf("%lld%lld%lld",&s,&l,&r);
Tree k=Tree{0,0,0};
ask(1,1,m,l,r,k);
printf("%lld\n",(1ll,max(1ll,(s>>k.right))<<k.left|k.up));
}
else {
int x,y;scanf("%lld%lld",&x,&y);
change(1,1,m,x,y);
}
}
xx;
}
signed main()
{
solve();
xx 0;
}
调半天没调出来,一直re,求大佬帮调一下: (