#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rint register long long
ll n,m,tree[400010],qz,zz,zzz,num,k,x,y,z,l,r,maxn=-1,kk,ans[400010][3],li[400010],ri[400010];
short p[400010];
char a[400010];
inline ll read(){
ll x=0,m=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') m=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-48;
ch=getchar();
}
return x*m;
}
inline void write(ll x){
if(x<0){
putchar('-');
write(-x);
return;
}
if(x>=10) write(x/10);
putchar(x%10+'0');
}
inline void work(ll x,ll y,ll s){
if(s==zz+1) return;
work(x*2,y,s+1);
work(x*2+1,y,s+1);
tree[x*2]+=y;
tree[x*2+1]+=y;
}
inline void make(ll x,ll y){
if(x==y) return;
make(x,y/2);
num+=tree[y];
}
signed main(){
n=read(),m=read();
cin>>a;
for(rint sum=1;sum<=m;++sum){
k=read();
if(k==1){
x=read(),y=read(),z=read();
qz=1;
for(rint i=y-1;i>=x-1;--i){
ans[sum][1]+=(a[i]==48?0:1)*qz;
qz*=2;
}
ans[sum][2]=z;
p[sum]=1;
}
if(k==2){
for(rint i=1;i<=2;++i){
l=read();r=read();
qz=1;
for(rint j=r-1;j>=l-1;--j){
if(i==1) li[sum]+=(a[j]==48?0:1)*qz;
else ri[sum]+=(a[j]==48?0:1)*qz;
qz*=2;
}
}
if(li[sum]>maxn)maxn=li[sum];
if(ri[sum]>maxn) maxn=ri[sum];
p[sum]=2;
}
}
while(maxn>0){
maxn-=pow(2,zz);
++zz;
}
for(rint i=1;i<=m;++i){
if(p[i]==1){
zzz=1;
kk=ans[i][1];
while(kk>0){
kk-=pow(2,zzz);
++zzz;
}
tree[ans[i][1]]+=ans[i][2];
work(ans[i][1],ans[i][2],zzz);
}
if(p[i]==2){
if(li[i<ri[i]) num=tree[li[i]],make(li[i],ri[i]);
else num=tree[ri[i]],make(ri[i],li[i]);
write(num);
putchar('\n');
num=0;
}
}
return 0;
}
样例过了,但是1~3测试点不是MLE就是RE,怎么办QAQ(马蜂清奇不要在意)