loj #6280. 数列分块入门 4

 

 :::开long long

:::int ll 间 可以随意换

//a[i]<=int ->s >>>int -> ll
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const int maxn=5e4+10;

ll n,a[maxn],s[maxn],b[maxn],c,id[maxn],len;

void add(int l,int r,int val)
{
    if(id[l]==id[r]){
        for(int i=l;i<=r;i++) a[i]+=val,s[id[l]]+=val;
        return;
    } 
    for(int i=l;id[i]==id[l];i++) a[i]+=val,s[id[l]]+=val;
    for(int i=id[l]+1;i<id[r];i++) b[i]+=val,s[i]+=len*val;
    for(int i=r;id[i]==id[r];i--) a[i]+=val,s[id[r]]+=val;
}
ll query(int l,int r,ll mod)
{
    int ans=0;
    if(id[l]==id[r]){
        for(int i=l;i<=r;i++) ans=(ans+a[i]+b[id[l]])%mod;
        return ans;
    } 
    for(int i=l;id[i]==id[l];i++) ans=(1ll*ans+a[i]+b[id[l]])%mod;
    for(int i=id[l]+1;i<id[r];i++) ans=(1ll*ans+s[i])%mod; //b[i] i->id 散户 individualy 
    for(int i=r;id[i]==id[r];i--)    ans=(1ll*ans+a[i]+b[id[r]])%mod;
    return ans%mod;
}

int main()
{
    ios::sync_with_stdio(false);
    cin>>n;    len=sqrt(n);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        id[i]=(i-1)/len+1;
        s[id[i]]+=a[i];
    }
    for(int i=1;i<=n;i++){
        int opt,l,r;ll c;    cin>>opt>>l>>r>>c;
        if(opt==0) add(l,r,c);
        else cout<<query(l,r,c+1)<<'\n';
    }
    return 0;
}
View Code

 

 
posted @ 2023-08-19 00:32  JMXZ  阅读(7)  评论(0)    收藏  举报