萌新10分分块求助
查看原帖
萌新10分分块求助
648772
Liyuqiao11楼主2023/3/5 14:13
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
long long int n,m,a[N],len,id[N],tag[N],Tag[N],minn[N],cnt[N],vis[N];
long long int md=998244353;
void fix(int l,int r){
    int sid=id[l],eid=id[r];
    if(sid==eid){
        for(int i=l;i<=r;i++){
            if(tag[i]+Tag[sid]>0){
                tag[i]--;
                minn[sid]=min(minn[sid],tag[i]+Tag[sid]);
            }
            else{
                a[i]=sqrt(a[i]);
                if(a[i]==1&&vis[i]==0){
                    cnt[sid]++;
                    vis[i]=1;
                }
            }
        }
        return;
    }
    for(int i=l;id[i]==sid;i++){
        if(tag[i]+Tag[sid]>0){
            tag[i]--;
            minn[sid]=min(minn[sid],tag[i]+Tag[sid]);
        }
        else{
            a[i]=sqrt(a[i]);
            if(a[i]==1&&vis[i]==0){
                cnt[sid]++;
                vis[i]=1;
            }
        }
    }
    for(int i=sid+1;i<eid;i++){
        if(cnt[i]!=len){
            if(minn[i]>0){
                Tag[i]--;
                minn[i]--;
            }
            else if(minn[i]==0){
                for(int j=(i-1)*len+1;id[j]==i;j++){
                    if(tag[j]+Tag[i]>0){
                        tag[j]--;
                    }
                    else{
                        a[j]=sqrt(a[j]);
                        if(a[j]==1&&vis[j]==0){
                            cnt[i]++;
                            vis[j]=1;
                        }
                    }
                }
            }
        }
    }
    for(int i=r;id[i]==eid;i--){
        if(tag[i]+Tag[eid]>0){
            tag[i]--;
            minn[eid]=min(minn[eid],tag[i]+Tag[eid]);
        }
        else{
            a[i]=sqrt(a[i]);
            if(a[i]==1&&vis[i]==0){
                cnt[eid]++;
                vis[i]=1;
            }
        }
    }
    return;
}
void fix_2(int l,int r){
    int sid=id[l],eid=id[r];
    if(sid==eid){
        for(int i=l;i<=r;i++){
            tag[i]++;
        }
        minn[sid]=1e18;
        for(int i=(sid-1)*len+1;id[i]==sid;i++){
            minn[sid]=min(minn[sid],tag[i]+Tag[sid]);
        }
        return;
    }
    for(int i=l;id[i]==sid;i++){
        tag[i]++;
    }
    minn[sid]=1e18;
    for(int i=(sid-1)*len+1;id[i]==sid;i++){
        minn[sid]=min(minn[sid],tag[i]+Tag[sid]);
    }
    for(int i=sid+1;i<eid;i++){
        if(cnt[i]!=len){
            Tag[i]++;
            minn[i]++;
        }
    }
    for(int i=r;id[i]==eid;i--){
        tag[i]++;
    }
    minn[eid]=1e18;
    for(int i=(eid-1)*len+1;id[i]==eid;i++){
        minn[eid]=min(minn[eid],tag[i]+Tag[eid]);
    }
    return;
}
int main(){
    cin>>n>>m;
    len=sqrt(n);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        id[i]=(i-1)/len+1;
    }
    for(int i=1;i<=m;i++){
        int op,l,r;
        cin>>op>>l>>r;
        if(op==1){
            fix(l,r);
        }
        if(op==2){
            fix_2(l,r);
        }
    }
    long long int ans=0;
    for(int i=1;i<=n;i++){
        long long int y=pow(2,(tag[i]+Tag[id[i]]));
        y=y%(md-1);
        long long int x=pow(a[i],y);
        x=x%md;
        ans+=x;
    }
    cout<<ans;
    return 0;
}
2023/3/5 14:13
加载中...