#include<iostream> #include<fstream> #include<algorithm> #include<vector> #include<cmath> #include<cstdio> #include<cstring> #include<cstdlib> #define inf 0x3f3f3f3f #define ll long long #define N 1000009 using namespace std; ll tag[N],v[N],sum[N]; int n,len; int blo[N],L[N],R[N]; ll read() { char ch=getchar();ll f=1,ret=0; while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();} return ret; } void change(int l,int r,int d) { for (int i=l;i<=min(R[l],r);i++) v[i]+=d,sum[blo[l]]+=d; if (blo[l]!=blo[r]) for (int i=L[r];i<=r;i++) v[i]+=d,sum[blo[r]]+=d; for (int i=blo[l]+1;i<=blo[r]-1;i++) tag[i]+=d; } ll query(int l,int r,int p) { ll ret=0; for (int i=l;i<=min(R[l],r);i++) ret=(ret+v[i]+tag[blo[l]])%p; if (blo[l]!=blo[r]) for (int i=L[r];i<=r;i++) ret=(ret+v[i]+tag[blo[r]])%p; for (int i=blo[l]+1;i<=blo[r]-1;i++) ret=(len*tag[i]+sum[i]+ret)%p; return ret; } int main() { n=read();len=sqrt(n); for (int i=1;i<=n;i++) v[i]=read(); for (int i=1;i<=n;i++) {blo[i]=(i-1)/len+1;sum[blo[i]]+=v[i];L[i]=(blo[i]-1)*len+1;R[i]=min(blo[i]*len,n);} for (int i=1;i<=n;i++) { int opt=read(),l=read(),r=read();ll d=read(); if (!opt) change(l,r,d); else printf("%lld\n",query(l,r,d+1)); } return 0; }
【loj6280】数列分块练习 4
猜你喜欢
转载自blog.csdn.net/Dadatu_Zhao/article/details/80559329
今日推荐
周排行