12pts,快读已略
#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
const int N = 2e5+100,M=5e5;
struct vectorr
{
int *p;
int siz,maxsiz;
vectorr()
{
p=(int*)malloc(sizeof(int)*10);
maxsiz=10;
}
inline void nnew()
{
int *p1=p;
p=(int*)malloc(sizeof(int)*maxsiz<<2ll);
maxsiz<<=2ll;
memcpy(p,p1,siz*sizeof(int));
free(p1);
}
inline void push_back(int x)
{
if(siz+1>=maxsiz)
{
nnew();
}
p[siz++]=x;
}
inline int& operator[](int x)
{
if(x>=siz)return siz;
return p[x];
}
inline void era()
{
if(siz==0)return;
siz--;
}
};
vectorr yin[(int)5e5+100];
inline void fuckkachangti()
{
for(int i=2;i<=M;i++)
{
for(int j=1;j*i<=M;j++)
{
yin[j*i].push_back(i);
}
}
}
inline int lowbit(int x)
{
return x&-x;
}
int n,m;
vectorr pos[M],nxt[M];
int in[N];
inline int nnext(int x,int y)
{
if(y>=nxt[x].siz)return y+1;
if(nxt[x][y]!=y)return nxt[x][y]=nnext(x,nxt[x][y]);
return y;
}
inline void init()
{
fuckkachangti();
for(int i=1;i<=n;i++)
{
for(int j=0;j<yin[in[i]].siz;j++)
{
pos[yin[in[i]][j]].push_back(i);
nxt[yin[in[i]][j]].push_back(nxt[yin[in[i]][j]].siz);
// cout<<yin[in[i]][j]<<' '<<nxt[yin[in[i]][j]].siz<<' '<<nxt[yin[in[i]][j]][nxt[yin[in[i]][j]].siz-1]<<'\n';
}
}
}
ll t[N*4];
inline void add(int x,int k)
{
for(int i=x;i<=n;i+=lowbit(i))
{
t[i]+=k;
}
}
ll find(int l,int r)
{
ll res=0;
for(int i=l-1;i;i-=lowbit(i))res-=t[i];
for(int i=r;i;i-=lowbit(i))res+=t[i];
return res;
}
inline void less1(int l,int r,int k)
{
// cout<<i<<"a "<<pos[k][i]<<'\n',,cout<<i<<'\n'
for(int i=0;i<pos[k].siz&&pos[k][i]<=r;i=nnext(k,i+1))
{
if(pos[k][i]<l)continue;
if(in[pos[k][i]]%k==0)
add(pos[k][i],-in[pos[k][i]]),
in[pos[k][i]]/=k,
add(pos[k][i],in[pos[k][i]]);
if(i)
if(nxt[k][i-1]<nnext(k,i+1))
nxt[k][i-1]=nnext(k,i+1);
}
}
inline void out()
{
cout<<"st\n";
for(int i=1;i<=n;i++)
{
cout<<in[i]<<' ';
}
cout<<'\n';
}
int main()
{
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
ll ans=0;
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
read(n,m);
for(int i=1;i<=n;i++)
{
read(in[i]);
add(i,in[i]);
}
init();
int op,l,r,k;
for(int i=1;i<=m;i++)
{
// out();
read(op);
if(op&1)
{
read(l,r,k);
l^=ans,r^=ans,k^=ans;
less1(l,r,k);
}
else
{
read(l,r);
l^=ans,r^=ans;
ans=find(l,r);
write(ans);
putc('\n');
}
}
}