和题解拍了几组小数据都是对的
虽然我知道不会有人来看的
#include<bits/stdc++.h>
#define base 16
#define N 500005
#define len 10
#define ll long long
using namespace std;
int n,m,a[N],sum[15],opt,l,r,x,tot;
long long lst;
struct node{
int mn,mx,tag,cnt;
long long sum;
}t[9][N/2];
inline int read(){
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){
x=(x*10)+ch-'0';
ch=getchar();
}
return x;
}
void push_up(int p1,int p2){
t[p1][p2].sum=t[p1][p2<<1].sum+t[p1][p2<<1|1].sum;
t[p1][p2].cnt=t[p1][p2<<1].cnt+t[p1][p2<<1|1].cnt;
t[p1][p2].mx=max(t[p1][p2<<1].mx,t[p1][p2<<1|1].mx);
t[p1][p2].mn=min(t[p1][p2<<1].mn,t[p1][p2<<1|1].mn);
}
void del(int p1,int p2,int k,int l,int r){
if(r-l+1<=len){
for(int i=l;i<=r;i++)
if(a[i]>=sum[p1-1]&&a[i]<sum[p1])a[i]-=k,t[p1][p2].sum-=k;
t[p1][p2].mn-=k,t[p1][p2].mx-=k;
return;
}
t[p1][p2].tag+=k;
t[p1][p2].mn-=k,t[p1][p2].mx-=k,t[p1][p2].sum-=(ll)t[p1][p2].cnt*k;
}
void push_down(int p1,int p2,int l,int r){
if(!t[p1][p2].tag)return;
int mid=(l+r)>>1;
del(p1,p2<<1,t[p1][p2].tag,l,mid),del(p1,p2<<1|1,t[p1][p2].tag,mid+1,r);
t[p1][p2].tag=0;
}
void build(int l,int r,int p,int P){
if(r-l+1<=len){
t[P][p].mn=2e9;
for(int i=l;i<=r;i++){
if(!(a[i]>=sum[P-1]&&a[i]<sum[P]))continue;
t[P][p].sum+=a[i];
t[P][p].cnt++;
t[P][p].mx=max(t[P][p].mx,a[i]);
t[P][p].mn=min(t[P][p].mn,a[i]);
}
return;
}
int mid=(l+r)>>1;
build(l,mid,p<<1,P);
build(mid+1,r,p<<1|1,P);
push_up(P,p);
}
void add(int p,int l,int r,int p1,int p2){
if(r-l+1<=len){
t[p1][p2].sum+=a[p],t[p1][p2].mx=max(t[p1][p2].mx,a[p]);
t[p1][p2].mn=min(t[p1][p2].mn,a[p]),t[p1][p2].cnt++;
return;
}
int mid=(l+r)>>1;
push_down(p1,p2,l,r);
if(mid>=p)add(p,l,mid,p1,p2<<1);
else add(p,mid+1,r,p1,p2<<1|1);
push_up(p1,p2);
}
void upd(int l1,int r1,int l,int r,int p1,int p2,int k){
if(t[p1][p2].mn==2000000000||t[p1][p2].mx<=k)return;
if(r-l+1<=len){
for(int i=l;i<=r;i++){
if(i<l1||i>r1||!(a[i]>=sum[p1-1]&&a[i]<sum[p1])||a[i]<=k)continue;
a[i]-=k;
t[p1][p2].sum-=k;
if(a[i]<sum[p1-1]){
for(int j=p1-1;j>=1;j--)if(a[i]>=sum[j-1]&&a[i]<sum[j])add(i,1,n,j,1);
t[p1][p2].sum-=a[i];
t[p1][p2].cnt--;
}
t[p1][p2].mn=2e9;
t[p1][p2].mx=0;
for(int i=l;i<=r;i++){
if(a[i]>=sum[p1-1]&&a[i]<sum[p1]){
t[p1][p2].mn=min(t[p1][p2].mn,a[i]);
t[p1][p2].mx=max(t[p1][p2].mx,a[i]);
}
}
}
return;
}
if(l>=l1&&r<=r1&&t[p1][p2].mn-sum[p1-1]>=k){
del(p1,p2,k,l,r);
return;
}
int mid=(l+r)>>1;
push_down(p1,p2,l,r);
if(mid>=l1)upd(l1,r1,l,mid,p1,p2<<1,k);
if(r1>mid)upd(l1,r1,mid+1,r,p1,p2<<1|1,k);
push_up(p1,p2);
}
ll q1(int l1,int r1,int l,int r,int p1,int p2){
if(l>=l1&&r<=r1)return t[p1][p2].sum;
ll res=0;
if(r-l+1<=len){
for(int i=l;i<=r;i++)
if(a[i]>=sum[p1-1]&&a[i]<sum[p1]&&i>=l1&&i<=r1)res+=a[i];
return res;
}
int mid=(l+r)>>1;
push_down(p1,p2,l,r);
if(mid>=l1)res+=q1(l1,r1,l,mid,p1,p2<<1);
if(r1>mid)res+=q1(l1,r1,mid+1,r,p1,p2<<1|1);
return res;
}
int q2(int l1,int r1,int l,int r,int p1,int p2){
if(l>=l1&&r<=r1)return t[p1][p2].mn;
int res=2e9;
if(r-l+1<=len){
for(int i=l;i<=r;i++)
if(a[i]>=sum[p1-1]&&a[i]<sum[p1]&&i>=l1&&i<=r1)res=min(res,a[i]);
return res;
}
int mid=(l+r)>>1;
push_down(p1,p2,l,r);
if(mid>=l1)res=min(res,q2(l1,r1,l,mid,p1,p2<<1));
if(r1>mid)res=min(res,q2(l1,r1,mid+1,r,p1,p2<<1|1));
return res;
}
int q3(int l1,int r1,int l,int r,int p1,int p2){
if(l>=l1&&r<=r1)return t[p1][p2].mx;
int res=0;
if(r-l+1<=len){
for(int i=l;i<=r;i++)if(a[i]>=sum[p1-1]&&a[i]<sum[p1]&&i>=l1&&i<=r1)res=max(res,a[i]);
return res;
}
int mid=(l+r)>>1;
push_down(p1,p2,l,r);
if(mid>=l1)res=max(res,q3(l1,r1,l,mid,p1,p2<<1));
if(r1>mid)res=max(res,q3(l1,r1,mid+1,r,p1,p2<<1|1));
return res;
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
sum[0]=1;
for(int i=1;i<=7;i++)sum[i]=sum[i-1]*base;
sum[8]=1e9+1;
for(int i=1;i<=8;i++)build(1,n,1,i);
while(m--){
opt=read(),l=read(),r=read();
if(opt==1)x=read();
l^=lst,r^=lst,x^=lst;
if(opt==1)for(int i=1;i<=8;i++)upd(l,r,1,n,i,1,x);
else{
lst=0;
int t1=2e9,t2=0;
for(int i=1;i<=8;i++){
lst+=q1(l,r,1,n,i,1);
t1=min(t1,q2(l,r,1,n,i,1));
t2=max(t2,q3(l,r,1,n,i,1));
}
printf("%lld %d %d\n",lst,t1,t2);
lst%=(1<<20);
}
}
}
/*
10 10
23423 5646 6346 676 25325 767 5235 6755 546346 634
2 1 5
2 1 9
2 6 10
2 3 6
1 1 10 6744
2 4 7
1 4 8 2352
1 1 10 10000
2 4 9
2 1 6
*/