分块板子简易写法

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a[1000000],siz;
ll k[1000000],lazy[1000000];
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    ll opt,l,r,c;
    ll nn=n;
    siz=sqrt(n);
    for(int i=0;i<n;i++){
        k[i/siz]+=a[i];
    }
    while(nn--){
        cin>>opt>>l>>r;
        l--,r--;
        ll st=l/siz,ed=r/siz;
        if(opt==0){
            cin>>c;
            if(st==ed){
                for(int i=l;i<=r;i++){
                    a[i]+=c;
                    k[st]+=c;
                }
            }
            else{
                for(int i=l;i<(st+1)*siz;i++){
                    a[i]+=c;
                    k[st]+=c;
                }
                for(int i=st+1;i<ed;i++){
                    lazy[i]+=c;
                    k[i]+=c*siz;
                }
                for(int i=ed*siz;i<=r;i++){
                    a[i]+=c;
                    k[ed]+=c;
                }
            }
        }
        else{
            ll sum=0;
            cin>>c;
            if(st==ed){
                for(int i=l;i<=r;i++){
                    sum+=a[i]+lazy[st];
                    sum%=(c+1);
                }
            }
            else{
                for(int i=l;i<(st+1)*siz;i++){
                    sum+=a[i]+lazy[st];
                    sum%=(c+1);
                }
                for(int i=st+1;i<ed;i++){
                    sum+=k[i];
                    sum%=(c+1);
                }
                for(int i=ed*siz;i<=r;i++){
                    sum+=a[i]+lazy[ed];
                    sum%=(c+1);
                }
            }
            cout<<sum<<"\n";
        }
    }
    return 0;
}

posted @ 2025-09-09 21:41  MistyPost  阅读(8)  评论(0)    收藏  举报