record:https://www.luogu.com.cn/record/165504502。
code:
#include<bits/stdc++.h>
//#pragma GCC optimize(3,"Ofast","inline")
//#define int long long
#define ll long long
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
using namespace std;
void file_IO() {
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
bool M1;
namespace IO {
char Is[(1<<21)+10],Os[(1<<21)+10];
int Ipt,Opt;
char gc() {
if(Ipt==1<<21)
Ipt=0;
if(!Ipt)
Is[fread(Is,1,1<<21,stdin)]=0;
return Is[Ipt++];
}
void flush() {
fwrite(Os,1,Opt,stdout);
Opt=0;
}
void pc(char x) {
if(Opt==1<<21)
flush();
Os[Opt++]=x;
}
ll read() {
ll x=0;
char ch=gc();
while(ch<'0'||ch>'9')
ch=gc();
while(ch<='9'&&ch>='0')
x=x*10+ch-48,ch=gc();
return x;
}
int t[20];
void write(ll x) {
if(x<0)
pc('-'),x=-x;
if(!x) {
pc('0');
return;
}
int len=0;
while(x)
t[++len]=x%10,x/=10;
per(i,len,1)
pc(t[i]+48);
}
}
using namespace IO;
const int N=1e5+5,M=5e5+5,m=5e5;
int a[N],n,q;
struct BIT {
ll tree[N];
void update(register int x,const register int &k) {
while(x<=n)
tree[x]+=k,x+=x&-x;
}
ll query(register int x) {
ll res=0;
while(x)
res+=tree[x],x-=x&-x;
return res;
}
ll query(const register int &l,const register int &r) {
return query(r)-query(l-1);
}
}; BIT T;
vector<int> vec[M],fa[M];
int f[M];
int find(const register int &d,const register int &x) {
if(fa[d][x]!=x)
fa[d][x]=find(d,fa[d][x]);
return fa[d][x];
}
void ins(const register int &d,const register int &x) {
fa[d].push_back(f[d]);
vec[d].push_back(x);
++f[d];
}
void del(int l,const register int &r,const register int &d) {
l=lower_bound(vec[d].begin(),vec[d].end(),l)-vec[d].begin();
int len=f[d];
if(l==len)
return;
for(int i=find(d,l);i<len&&vec[d][i]<=r;i=find(d,i+1)) {
int &x=a[vec[d][i]];
if(x%d==0) {
T.update(vec[d][i],x/d-x);
x/=d;
}
if(i==len-1)
return;
if(x%d!=0)
fa[d][i]=i+1;
}
}
vector<int> c[M];
void solve() {
n=read(); q=read();
int mx=0;
rep(i,1,n) {
a[i]=read();
if(a[i]>mx)
mx=a[i];
c[a[i]].push_back(i);
T.update(i,a[i]);
}
rep(i,2,mx) {
rep(j,1,mx/i) {
for(auto x:c[i*j])
ins(i,x);
}
}
ll ans=0;
while(q--) {
ll op=read(),l=read(),r=read();
l^=ans; r^=ans;
if(op==1) {
ll x=read();
x^=ans;
if(x>1&&x<=mx)
del(l,r,x);
} else
write(ans=T.query(l,r)),pc('\n');
}
flush();
}
bool M2;
signed main() {
//file_IO();
int testcase=1;
//scanf("%d",&testcase);
while(testcase--)
solve();
cerr<<"used time = "<<1000*clock()/CLOCKS_PER_SEC<<"ms\n";
cerr<<"used memory = "<<(&M1-&M2)/1024/1024<<"MB\n";
return 0;
}