分块25pts求助,悬棺
查看原帖
分块25pts求助,悬棺
812227
Sunrise_beforeglow楼主2025/1/10 10:43
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[200005],op,l,r,cnta[2005],cntb[2005],len,cnt[200005];
const int M=998244353;
void push_down(int x)
{
    for(int i=x*len-len+1;i<=x*len;i++)
    {
        cnt[i]+=cntb[x];
    }
    cntb[x]=0;
}
int find(int x)
{
    return (x+len-1)/len;
}
int fpow(int a,int b,int p)
{
    int mul=1;
    while(b)
    {
        if(b%2)mul=mul*a%p;
        a=a*a%p;
        b/=2;
    }
    return mul;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m;
    len=sqrt(n);
    for(int i=1;i<=n;i++)cin>>a[i];
    while(m--)
    {
        cin>>op>>l>>r;
        if(op==1)
        {
            int sl=find(l),sr=find(r);
            push_down(sl);
            push_down(sr);
            if(sl==sr)
            {
                for(int i=l;i<=r;i++)
                {
                    if(cnt[i])
                    {
                        cnt[i]--;
                        continue;
                    }
                    a[i]=(int)sqrt(a[i]);
                }
            }
            else
            {
                for(int i=l;i<=sl*len;i++)
                {
                    if(cnt[i])
                    {
                        cnt[i]--;
                        continue;
                    }
                    a[i]=(int)sqrt(a[i]);
                }
                for(int i=sr*len-len+1;i<=r;i++)
                {
                    if(cnt[i])
                    {
                        cnt[i]--;
                        continue;
                    }
                    a[i]=(int)sqrt(a[i]);
                }
                for(int i=sl+1;i<sr;i++)
                {
                    if(cnta[i]>=5)continue;
                    if(cntb[i])
                    {
                        cntb[i]--;
                        continue;
                    }
                    for(int j=i*len-len+1;j<=i*len;j++)
                    {
                        if(cnt[j])
                        {
                            cnt[j]--;
                            continue;
                        }
                        a[j]=(int)sqrt(a[j]);
                    }
                    cnta[i]++;
                }
            }
        }
        else
        {
            int sl=find(l),sr=find(r);
            if(sl==sr)
            {
                for(int i=l;i<=r;i++)cnt[i]++;
            }
            else
            {
                for(int i=l;i<=sl*len;i++)cnt[i]++;
                for(int i=sr*len-len+1;i<=r;i++)cnt[i]++;
                for(int i=sl+1;i<sr;i++)cntb[i]++;
            }
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        int x=cnt[i]+cntb[find(i)];
        if(x>=30)x=fpow(2,x,M-1)+M-1;
        else x=(1<<x);
        a[i]=fpow(a[i],x,M);
        sum+=a[i];
        sum%=M;
    }
    cout<<sum;
    return 0;
}
2025/1/10 10:43
加载中...