再交几次估计我也进陶片了
#include<bits/stdc++.h>
using namespace std;
char ibuf[900<<20],*re,out[900<<20];
int wz;
inline int read()
{
register int u=0;
while(*re<48) re++;
while(*re>32)
u=u*10+*re++-48;
return u;
}
void print(long long x)
{
if(x>9) print(x/10);
out[wz++]=x%10+'0';
}
#define lowbit(x) (x&(-x))
long long tree[500001];
int n;
inline long long get_sum(int wh)
{
register long long ans=0;
for(;wh;wh^=lowbit(wh)) ans+=tree[wh];
return ans;
}
inline void add(int wh,long long v)
{
for(;wh<=n;wh+=lowbit(wh)) tree[wh]+=v;
}
vector<int>fa[500008],ys[500008];
int find(int x,int i)
{
if(i==fa[x].size()||fa[x][i]==i)return i;
else return fa[x][i]=find(x,fa[x][i]);
}
int a[100008],m,nmp;
long long la;
int main()
{
fread(re=ibuf,1,900<<20,stdin);
n=read();m=read();
for(register int i=1;i<=n;i++)
{
add(i,a[i]=read());
nmp=max(nmp,a[i]);
for(register int j=1;j*j<=a[i];j++)
{
if(!(a[i]%j))
{
ys[j].push_back(i);
if(a[i]!=j*j)ys[a[i]/j].push_back(i);
}
}
}
for(int i=2;i<=nmp;i++)
{
fa[i].resize(ys[i].size());
for(int j=0;j<ys[i].size();j++)fa[i][j]=j;
}
while(m--)
{
short opt=read();
switch(opt)
{
case 1:
{
int l=read()^la,r=read()^la,x=read()^la;
if(ys[x].empty()||x==1)continue;
for(register int l1=find(x,lower_bound(ys[x].begin(),ys[x].end(),l)-ys[x].begin());l1<ys[x].size()&&ys[x][l1]<=r;l1=find(x,l1+1))
{
if(!(a[ys[x][l1]]%x))
{
add(ys[x][l1],-a[ys[x][l1]]+a[ys[x][l1]]/x);
a[ys[x][l1]]/=x;
}
if(a[ys[x][l1]]%x)fa[x][l1]=l1+1;
}
break;
}
case 2:
{
int l=read()^la,r=read()^la;
la=get_sum(r)-get_sum(l-1);
print(la),out[wz++]='\n';
break;
}
}
}
fwrite(out,1,wz,stdout);
return 0;
}
我分析了一下command_block的代码,他把vector改成了int*,但是没看出来int*如何初始化的内存qwq