分块0分求助
查看原帖
分块0分求助
516468
_Give_up_楼主2022/9/10 21:51

这是肿么回事?

#include<bits/stdc++.h>
#define int long long
#define mod 998244353
#define N 200010

using namespace std;

int read()
{
	int x = 0,f = 1;
	char c = getchar();
	while(c<'0' || c>'9')
	{
		if(c=='-') f = -1;
		c = getchar();
	}
	while(c>='0' && c<='9')
	{
		x = (x<<3)+(x<<1)+(c^48);
		c = getchar();
	}
	return x*f;
}

int a[N],s[N],id[N],len;
bool f[N];

void add(int l,int r)
{
    int start=id[l],end=id[r];
    if (start==end)
    {
        for (int i=l;i<=r;i++)
        {
            s[start] -= a[i];
            a[i] = (int)sqrt(a[i])%mod;
            s[start] = (s[start]+a[i])%mod;
        }
        return ;
    }
	for (int i=l;id[i]==start;i++)
    {
        s[start] -= a[i];
        a[i] = (int)sqrt(a[i])%mod;
        s[start] = (s[start]+a[i])%mod;
    }
    for (int i=start+1;i<end;i++)
    {
        if(!f[i])
    	{
			f[i] = true,s[i] = 0;
			for (int j=(i-1)*len+1;j<=i*len;j++)
			{
				a[j] = (int)sqrt(a[j])%mod;
				s[i] = (s[i]+a[j])%mod;
				if(a[j]>1) f[i]=false;
    		}
		}
    }
    for (int i=r;id[i]==end;i--)
    {
        s[end] -= a[i];
        a[i] = (int)sqrt(a[i])%mod;
        s[end] = (s[end]+a[i])%mod;
    }
}

void update(int l,int r)
{
	int start=id[l],end=id[r];
	if (start==end)
	{
		for (int i=l;i<=r;i++)
		{
			s[start] -= a[i];
			a[i] = a[i]*a[i]%mod;
			s[start] = (s[start]+a[i])%mod;
		}
		return ;
	}
	for (int i=l;id[i]==start;i++)
	{
		s[start] -= a[i];
		a[i] = a[i]*a[i]%mod;
		s[start] = (s[start]+a[i])%mod;
	}
	for (int i=start+1;i<end;i++)
	{
		if(!f[i])
    	{
			f[i] = true,s[i] = 0;
			for (int j=(i-1)*len+1;j<=i*len;j++)
			{
				a[j] = a[j]*a[j]%mod;
				s[i] = (s[i]+a[j])%mod;
				if(a[j]>1) f[i]=false;
    		}
		}
	}
	for (int i=r;id[i]==end;i--)
	{
		s[end] -= a[i];
		a[i] = a[i]*a[i]%mod;
		s[end] = (s[end]+a[i])%mod;
	}
}

signed main()
{
	int n=read(),t=read();
	len=sqrt(n);
	for (int i=1;i<=n;i++)
	{
		a[i]=read();
		id[i] = (i-1)/len+1;
		s[id[i]] += a[i];
	}
	while(t--)
	{
		int opt=read(),l=read(),r=read();
		if (opt==1) add(l,r);
		else update(l,r);
	}
	int ans=0;
	for (int i=id[1];i<=id[n];i++)
		ans += s[i];
	cout << ans%mod << endl;
	return 0;
}
2022/9/10 21:51
加载中...