虽然已经过了,但搞不懂为什么下面这份代码会全 RE。
#include<bits/stdc++.h>
using namespace std;
#define rg register
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
#define djq 1000000007
#define lowbit(x) (x&(-x))
#define siz 100000
const double pi=acos(-1.0);
inline void file(){
freopen("test.in","r",stdin);
freopen("test.ans","w",stdout);
}
char buf[1<<21],*p1=buf,*p2=buf;
inline int getc(){
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
rg int ret=0,f=0;char ch=getc();
while(!isdigit(ch)){if(ch=='-')f=1;ch=getc();}
while(isdigit(ch)){ret=ret*10+ch-48;ch=getc();}
return f?-ret:ret;
}
int n,m,q;
int a[500005],v,l,r,opt;
ll s;
struct node{
int l,r,up,dn;
ll val;
}t[500005<<3];
inline void up(node& x,const node cl,const node cr){
x.l=cl.l; x.r=cr.r;
if(!cl.up&&!cl.dn) return x=cr,void();
if(!cr.up&&!cr.dn) return x=cl,void();
if(cl.dn>cr.up){
x.up=cl.up;
x.dn=cl.dn+cr.dn-cr.up;
x.val=((cl.val>>cr.up)<<cr.dn)+cr.val;
}else{
x.up=cl.up+cr.up-cl.dn;
x.dn=cr.dn;
x.val=cr.val;
}
}
void build(int x,int l,int r){
t[x].l=l; t[x].r=r;
if(l==r){
if(a[l]==1){
t[x].dn=1;
}else if(a[l]==2){
t[x].dn=1;
t[x].val=1;
}else{
t[x].up=1;
}
return;
}
const int mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
up(t[x],t[x<<1],t[x<<1|1]);
}
void modify(int x,const int y,const int v){
if(t[x].l==t[x].r){
t[x].up=t[x].dn=t[x].val=0;
if(v==1){
t[x].dn=1;
}else if(v==2){
t[x].dn=1;
t[x].val=1;
}else{
t[x].up=1;
}
return;
}
const int mid=t[x].l+t[x].r>>1;
if(y<=mid) modify(x<<1,y,v);
else modify(x<<1|1,y,v);
up(t[x],t[x<<1],t[x<<1|1]);
}
node query(int x,const int sl,const int sr){
if(sl<=t[x].l&&sr>=t[x].r) return t[x];
const int mid=t[x].l+t[x].r>>1;
if(sl>mid) return query(x<<1|1,sl,sr);
if(sr<=mid) return query(x<<1,sl,sr);
node ret,cl=query(x<<1,sl,sr),cr=query(x<<1|1,sl,sr);
up(ret,cl,cr);
return ret;
}
int main(){
n=read(),m=read(),q=read();
for(rg int i=1;i<=m;++i) a[i]=read();
build(1,1,m);
while(q--){
opt=read();
if(opt==1){
s=read(),l=read(),r=read();
const node ans=query(1,l,r);
printf("%d\n",(max(1ll,s>>ans.up)<<ans.dn)+ans.val);
}else{
s=read(),v=read();
modify(1,s,v);
}
}
return 0;
}