分块0分
查看原帖
分块0分
701221
Chr0n1CleC楼主2022/9/4 13:36
#include<stdio.h>
#include<math.h>
#define N 200009
#define int long long
#define mod 998244353

int a[N], whe[N];

int sum[N];

int st[N], en[N];

inline void updata1(int l, int r)
{
	int L = whe[l], R = whe[r];
	if (L == R)
		for (register int i = l;i <= r;++ i)
			sum[whe[i]] -= a[i], a[i] = sqrt(a[i]), sum[whe[i]] += a[i], sum[whe[i]] %= mod;
	else
	{
		for (register int i = l;i <= en[L];++ i)
			sum[whe[i]] -= a[i], a[i] = sqrt(a[i]), sum[whe[i]] += a[i], sum[whe[i]] %= mod;
		for (register int i = st[R];i <= r;++ i)
			sum[whe[i]] -= a[i], a[i] = sqrt(a[i]), sum[whe[i]] += a[i], sum[whe[i]] %= mod;
		for (register int i = L + 1;i < R;++ i)
		{
			if (sum[i] == en[i] - st[i] + 1)
				continue;
			sum[i] = 0;
			for (register int j = st[i];j <= en[j];++ j)
				a[j] = sqrt(a[j]), sum[i] += a[j], sum[i] %= mod;
		}
	}
}

inline void updata2(int l, int r)
{
	int L = whe[l], R = whe[r];
	if (L == R)
		for (register int i = l;i <= r;++ i)
			sum[whe[i]] -= a[i], a[i] = (int)pow(a[i], 2) % mod, sum[whe[i]] += a[i], sum[whe[i]] %= mod;
	else
	{
		for (register int i = l;i <= en[L];++ i)
			sum[whe[i]] -= a[i], a[i] = (int)pow(a[i], 2) % mod, sum[whe[i]] += a[i], sum[whe[i]] %= mod;
		for (register int i = st[R];i <= r;++ i)
			sum[whe[i]] -= a[i], a[i] = (int)pow(a[i], 2) % mod, sum[whe[i]] += a[i], sum[whe[i]] %= mod;
		for (register int i = L + 1;i < R;++ i)
		{
			if (sum[i] == en[i] - st[i] + 1)
				continue;
			sum[i] = 0;
			for (register int j = st[i];j <= en[j];++ j)
				a[j] = (int)pow(a[j], 2) % mod, sum[i] += a[j], sum[i] %= mod;
		}
	}
}

inline int query(int l, int r)
{
	int L = whe[l], R = whe[r], ret = 0;
	if (L == R)
		for (int i = l;i <= r;++ i)
			ret += a[i], ret %= mod;
	else
	{
		for (int i = l;i <= en[L];++ i)
			ret += a[i], ret %= mod;
		for (int i = st[R];i <= r;++ i)
			ret += a[i], ret %= mod;
		for (int i = L + 1;i < R;++ i)
			ret += sum[i], ret %= mod;
	}
	return ret;
}

signed main()
{
	int n, m;
	scanf("%lld%lld", &n, &m);
	for (register int i = 1;i <= n;++ i)
		scanf("%lld", &a[i]);
	int block = sqrt(n);
	if (n % block)
		++ block;
	for (register int i = 1;i <= block;++ i)
		st[i] = en[i - 1] + 1, en[i] = st[i] + block - 1;
	en[block] = n;
	for (register int i = 1;i <= block;++ i)
		for (register int j = st[i];j <= en[i];++ j)
			whe[j] = i, sum[i] += a[j], sum[i] %= mod;
	int opt, l, r;
	while (m --)
	{
		scanf("%lld%lld%lld", &opt, &l, &r);
		if (opt == 1)
			updata1(l, r);
		else
			updata2(l, r);
	}
	printf("%lld", query(1, n));
	
	return 0;
}
2022/9/4 13:36
加载中...