为什么注释这行不能删掉呢,明明应该是x的因数才在vec[x]里面的
#include <bits/stdc++.h>
using namespace std;
long long c[100005];
int a[100005],n;
vector<int> vec[500005];
int read()
{
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x;
}
void write(long long x,bool f)
{
if(!x)
{
if(f)putchar('0');
return;
}
write(x/10,false);
putchar(x%10+'0');
return;
}
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int v)
{
for(int i=x;i<=n;i+=lowbit(i))c[i]+=v;
return;
}
long long sum(int x)
{
long long res=0;
for(int i=x;i;i-=lowbit(i))res+=c[i];
return res;
}
void init()
{
for(int i=1;i<=5e5;i++)vec[i].push_back(0);
for(int i=1;i<=n;i++)
{
add(i,a[i]);
for(int j=1;j*j<=a[i];j++)
{
if(a[i]%j!=0)continue;
vec[j].push_back(i);
if(a[i]/j!=j)vec[a[i]/j].push_back(i);
}
}
return;
}
int main()
{
int m;
n=read();m=read();
for(int i=1;i<=n;i++)a[i]=read();
init();
while(m--)
{
int op,l,r;
op=read();l=read();r=read();
if(op==1)
{
int x=read();
if(x==1)continue;
for(auto it=--upper_bound(vec[x].begin(),vec[x].end(),r);*it>=l;it--)
{
int p=*it;
if(a[p]%x!=0)continue;//这行
add(p,a[p]/x-a[p]);
a[p]/=x;
if(a[p]%x!=0)vec[x].erase(it);
}
}
else write(sum(r)-sum(l-1),true),putchar('\n');
}
return 0;
}