Unaccepted
查看原帖
Unaccepted
264463
添哥楼主2022/3/21 20:13

WA on #2

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[300005],tree[1200005];
bool ok[400005];
void build(int l,int r,int i)
{
	if(l==r)
	{
		tree[i]=a[l];
		if(tree[i]==1||tree[i]==2)
		{
			ok[i]=true;
		}
		else
		{
			ok[i]=false;
		}
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,i*2);
	build(mid+1,r,i*2+1);
	tree[i]=tree[i*2]+tree[i*2+1];
	ok[i]=(ok[i*2]&&ok[i*2+1]);
}
int q(int x)
{
	int s=0;
	for(int i=1;i*i<=x;i++)
	{
		if(x%i==0)
		{
			s+=2;
			if(i==x/i)
			{
				s--;
			}
		}
	}
	return s;
}
void Set(int l,int r,int ll,int rr,int i)
{
	if(ll>r||rr<l||ok[i])
	{
		return;
	}
	else if(l!=r)
	{
		int mid=(l+r)/2;
		Set(l,mid,ll,rr,i*2);
		Set(mid+1,r,ll,rr,i*2+1);
		tree[i]=tree[i*2]+tree[i*2+1];
		ok[i]=(ok[i*2]&&ok[i*2+1]);
	}
	else
	{
		tree[i]=q(tree[i]);
		if(tree[i]==1||tree[i]==2)
		{
			ok[i]=true;
		}
	}
}
long long ask(int l,int r,int ll,int rr,int i)
{
	if(ll>r||rr<l)
	{
		return 0;
	}
	else if(ll<=l&&r<=rr)
	{
		return tree[i];
	}
	else
	{
		int mid=(l+r)/2;
		return ask(l,mid,ll,rr,i*2)+ask(mid+1,r,ll,rr,i*2+1);
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,n,1);
	while(m--)
	{
		int opt,l,r;
		cin>>opt>>l>>r;
		if(opt==1)
		{
			Set(1,n,l,r,1);
		}
		else
		{
			cout<<ask(1,n,l,r,1)<<endl;
		}
	}
}
2022/3/21 20:13
加载中...