听说貌似手写内存池的,有大佬可以讲一讲吗? 肥肠感谢. 或者帮忙改改代码也行
#include <cmath>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
vector<int>fa[500001];
vector<int>fa2[500001];
int n,m;
long long a[100001];
int ss[100001];
long long last;
inline void add(int x,long long k)
{
while(x<=n)
{
a[x]+=k;
x+=(x&(-x));
}
}
inline long long sum(int x)
{
long long he=0;
while(x>0)
{
he+=a[x];
x=x-(x&-x);
}
return he;
}
inline int read( )
{
int f=0;
char ch;
ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')
{
f=f*10+ch-'0';
ch=getchar();
}
return f;
}
inline int find(int x,int k)
{
if(k==fa2[x].size()||k==fa2[x][k])return k;
return fa2[x][k]=find(x,fa2[x][k]);
}
inline void write(long long X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
signed main( )
{
n=read( );
m=read( );
for(int i=1;i<=n;++i)
{
ss[i]=read();
for(int j=1;j*j<=ss[i];++j)
{
if(ss[i]%j==0)
{
fa[j].push_back(i);
fa2[j].push_back(fa2[j].size());
if(j*j<ss[i])
{
fa[ss[i]/j].push_back(i);
fa2[ss[i]/j].push_back(fa2[ss[i]/j].size());
}
}
}
add(i,ss[i]);
}
int kind,l,r,x;
for(int i=1;i<=m;i++)
{
kind=read( );
if(kind==1)
{
l=read( ),r=read( ),x=read( ),l^=last,r^=last,x^=last;
if(x==1)continue;
int wei=lower_bound(fa[x].begin(),fa[x].end(),l)-fa[x].begin();
for(int i=find(x,wei);i<fa[x].size()&&fa[x][i]<=r;i=find(x,i+1))
{
if(ss[fa[x][i]]%x==0)
{
int o=fa[x][i];
ss[o]=ss[o]/x;
add(o,(long long)(-ss[o]*(x-1)));
}
if(ss[fa[x][i]]%x!=0)fa2[x][i]=i+1;
}
}
else{
l=read( ),r=read( ),l^=last,r^=last;
last=sum(r)-sum(l-1);
write(last);
putchar('\n');
}
}
return 0;
}