这是肿么回事?
#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;
}