TLE 求助
查看原帖
TLE 求助
523641
_Spectator_楼主2023/11/28 16:45
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5,A=1e6+5;
long long n,m;
int a[N],c[N];
int lowbit(int x){return x&-x;}
void update(int x,int k){
	while(x<=n)c[x]+=k,x+=lowbit(x);
}
int query(int x){
	int sum=0;
	while(x)sum+=c[x],x-=lowbit(x);
	return sum;
}
int f[N];
int find(int x)
{
	if(f[x]==x)return x;
	return f[x]=find(f[x]);
}
int cnt[A];
void init(int x)
{
	for(int i=1;i<=x;i++)
		for(int j=1;j<=x/i;j++)
			cnt[i*j]++;
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	init(1e6);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		update(i,a[i]);
		f[i]=i;
	}
	while(m--)
	{
		int t,l,r;
		cin>>t>>l>>r;
		if(t==1){
			for(int i=l;i<=r;i++)
			{
				i=find(i);
				if(i>r)break;
				update(i,cnt[a[i]]-a[i]);
				a[i]=cnt[a[i]];
				if(cnt[a[i]]==a[i])f[i]=find(i+1);
			}
		}
		else{
			cout<<query(r)-query(l-1)<<'\n';
		}
	}
	return 0;
}
2023/11/28 16:45
加载中...