RT.代码如下:
#include<bits/stdc++.h>
#define has(i) d[i]
#pragma GCC optimize(3,"Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,fma,popcnt,tune=native")
using namespace std;
int a[300010],ks[300010];
struct node{
int l,r;
long long sum;
bool flag;
}fk[548];
int d[3000010];
inline void query(int l,int r){
int ll=ks[l],rr=ks[r];
if(ll==rr){
for(int i=l;i<=r;i++){
if(a[i]>2){
fk[ll].sum-=a[i];
a[i]=has(a[i]);
fk[ll].sum+=a[i];
}
}
return;
}
for(int i=l;i<=fk[ll].r;i++){
if(a[i]>2){
fk[ll].sum-=a[i];
a[i]=has(a[i]);
fk[ll].sum+=a[i];
}
}
for(int i=fk[rr].l;i<=r;i++){
if(a[i]>2){
fk[rr].sum-=a[i];
a[i]=has(a[i]);
fk[rr].sum+=a[i];
}
}
for(int i=ll+1;i<rr;i++){
if(fk[i].flag){
continue;
}
fk[i].flag=1;
fk[i].sum=0;
for(int j=fk[i].l;j<=fk[i].r;j++){
a[j]=has(a[j]);
fk[i].sum+=a[j];
if(a[j]>2){
fk[i].flag=0;
}
}
}
}
inline long long ask(int l,int r){
int ll=ks[l],rr=ks[r];
long long sum=0;
if(ll==rr){
for(int i=l;i<=r;i++){
sum+=a[i];
}
return sum;
}
for(int i=l;i<=fk[ll].r;i++){
sum+=a[i];
}
for(int i=fk[rr].l;i<=r;i++){
sum+=a[i];
}
for(int i=ll+1;i<rr;i++){
sum+=fk[i].sum;
}
return sum;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m,cnt=0,len;
cin>>n>>m;
len=sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
ks[i]=(i-1)/len+1;
fk[ks[i]].sum+=a[i];
if((i-1)%len==0){
fk[++cnt].l=i;
}
if(i%len==0){
fk[cnt].r=i;
}
}
for(int i=1;i<=1e6;i++){
for(int j=i;j<=1e6;j+=i){
d[j]++;
}
}
while(m--){
int opt,l,r;
cin>>opt>>l>>r;
if(opt==1){
query(l,r);
}
else{
cout<<ask(l,r)<<endl;
}
}
return 0;
}
提示第119个数错了