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; }
                    
                
                
            
        
浙公网安备 33010602011771号