求救 WA #2(
查看原帖
求救 WA #2(
256970
xie_lzh楼主2021/8/12 19:06
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+5,M=5e6+5;
int n,m,op,l,r,d[M],cnt;
struct ltree
{
	int l,r,mx,sum;
}s[6000005];
int read()
{
	char c=getchar();
	int r=0,f=1;
	while(c<'0'||c>'9')
	{
		if(c=='-') f=-1;
		c=getchar();
	} 
	while(c>='0'&&c<='9') r=(r<<1)+(r<<3)+c-48,c=getchar();
	return r*f;
}
void make_d()
{
	for(int i=1;i<=M-5;i++)
		for(int j=i;j<=M-5;j+=i)
			d[j]++;
}
int ls(int x)
{
	return x<<1;
}
int rs(int x)
{
	return x<<1|1;
}
void push_up(int p)
{
	s[p].mx=max(s[ls(p)].mx,s[rs(p)].mx);
	s[p].sum=s[ls(p)].sum+s[rs(p)].sum;
}
void build(int l,int r,int p)
{
	s[p].l=l;
	s[p].r=r;
	if(l==r)
	{
		s[p].mx=s[p].sum=read();
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	push_up(p);
}
void update(int p)
{
	if(s[p].l>r||s[p].r<l) return ;
	if(s[p].mx<=2) return ;
	if(s[p].l==s[p].r)
	{
		s[p].sum=s[p].mx=d[s[p].sum];
		return ;
	}
	update(ls(p));
	update(rs(p));
	push_up(p);
}
int query(int p)
{
	if(s[p].l>r||s[p].r<l) return 0;
	if(s[p].l>=l&&s[p].r<=r) return s[p].sum;
	return query(ls(p))+query(rs(p));
}
signed main()
{
	n=read(); m=read();
	build(1,n,1);
	make_d();
	while(m--)
	{
		op=read(); l=read(); r=read();
		if(op==1) update(1);
		else printf("%d\n",query(1));
	}
}
2021/8/12 19:06
加载中...