萌新刚学OI,求调!
查看原帖
萌新刚学OI,求调!
286448
Eason2009楼主2023/10/4 16:48
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second
#define ls now<<1
#define rs now<<1|1
#define QwQ puts("QwQ")
using namespace std;
const int N=100005,M=5000005;
int n,m,a[N],phi[M],fa[M][5],dep[M],mx;
struct node
{
	int sum,mx,lca;
}tree[N<<2];
inline int read()
{
	int ans=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		ans=(ans<<3)+(ans<<1)+(c^48);
		c=getchar();
	}
	return ans*f;
}
inline void write(int x)
{
    if(x<0)
    {
        printf("-"),write(-x);
        return;
    }
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
int solve(int x,int y)
{
	if(dep[x]>=dep[y]) swap(x,y);
	for(int i=4;i>=0;i--)
	{
		if(dep[fa[y][i]]>=dep[x]) y=fa[y][i];
	}
	if(x==y) return x;
	for(int i=4;i>=0;i--)
	{
		if(dep[fa[x][i]]!=dep[fa[y][i]]) x=fa[x][i],y=fa[y][i];
	}
	return fa[x][0];
}
void pushup(int now)
{
	tree[now].sum=tree[ls].sum+tree[rs].sum;
	tree[now].mx=max(tree[ls].mx,tree[rs].mx);
	tree[now].lca=solve(tree[ls].lca,tree[rs].lca);
	return;
}
void build(int now,int l,int r)
{
	if(l==r)
	{
		tree[now]={dep[a[l]],dep[a[l]],a[l]};
		return;
	}
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(now);
	return;
}
void update(int now,int l,int r,int ql,int qr)
{
	if(!tree[now].mx) return;
	if(l==r)
	{
		a[l]=phi[a[l]];
		tree[now]={dep[a[l]],dep[a[l]],a[l]};
		return;
	}
	int mid=l+r>>1;
	if(ql<=mid) update(ls,l,mid,ql,qr);
	if(qr>mid) update(rs,mid+1,r,ql,qr);
	pushup(now);
	return;
}
node query(int now,int l,int r,int ql,int qr)
{
	if(l>=ql&&r<=qr) return tree[now];
	int mid=l+r>>1;
	if(qr<=mid) return query(ls,l,mid,ql,qr);
	if(ql>mid) return query(rs,mid+1,r,ql,qr);
	node res,res_ls=query(ls,l,mid,ql,qr),res_rs=query(rs,mid+1,r,ql,qr);
	res.sum=res_ls.sum+res_rs.sum;
	res.mx=max(res_ls.mx,res_rs.mx);
	res.lca=solve(res_ls.lca,res_rs.lca);
	return res;
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		mx=max(mx,a[i]);
	}
    for(int i=1;i<=M-5;i++) phi[i]=i;
    for(int i=2;i<=M-5;i++)
    {
    	if(phi[i]==i)
    	{
    		for(int j=i;j<=M-5;j+=i)
    		{
    			phi[j]*=(i-1);
    			phi[j]/=i;
			}
		}
	}
	fa[1][0]=1;
	for(int i=2;i<=M-5;i++) fa[i][0]=phi[i],dep[i]=dep[phi[i]]+1;
	for(int j=1;j<=4;j++)
	{
		for(int i=1;i<=M-5;i++)
		{
			fa[i][j]=fa[fa[i][j-1]][j-1];
		}
	}
	build(1,1,n);
	while(m--)
	{
		int op,l,r;
		op=read(),l=read(),r=read();
		if(op==1) update(1,1,n,l,r);
		else
		{
			node ans=query(1,1,n,l,r);
			write(ans.sum-(r-l+1)*dep[ans.lca]);
			printf("\n");
		}
	}
	return 0;
}
2023/10/4 16:48
加载中...