题目:https://www.luogu.com.cn/problem/P2023
大佬们能帮我康康代码吗,实在找不到错误了qwq
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
typedef long long ll;
ll n,m;
ll p,a[MAXN];
ll sqrtn;
ll block[MAXN],lazy_mul[MAXN],lazy_plus[MAXN];
ll cnt_block,l[MAXN],r[MAXN],belong[MAXN];
void build(){
for(ll i=1;i<=sqrtn;i++){
l[i]=r[i-1]+1;
r[i]=l[i]+sqrtn-1;
cnt_block++;
}
if(r[cnt_block]<n){
cnt_block++;
l[cnt_block]=r[cnt_block-1]+1;
r[cnt_block]=n;
}
for(ll i=1;i<=cnt_block;i++){
for(ll j=l[i];j<=r[i];j++){
block[i]+=a[j];
belong[j]=i;
}
lazy_mul[i]=1;
}
}
void push_down(ll num){
if(lazy_mul[num]!=1){
for(ll i=l[num];i<=r[num];i++){
a[i]=a[i]*lazy_mul[num]%p;
}
lazy_mul[num]=1;
}
if(lazy_plus[num]!=0){
for(ll i=l[num];i<=r[num];i++){
a[i]=(a[i]+lazy_plus[num])%p;
}
lazy_plus[num]=0;
}
}
void push_up(ll num){
block[num]=0;
for(int i=l[num];i<=r[num];i++){
block[num]+=a[i];
block[num]%=p;
}
}
ll query(ll L,ll R){
ll ret=0;
push_down(belong[L]);
push_down(belong[R]);
if(belong[L]==belong[R]){
for(ll i=L;i<=R;i++){
ret+=a[i];
ret%=p;
}
}else{
for(ll i=L;i<=r[belong[L]];i++){
ret+=a[i];
ret%=p;
}
L=l[belong[L]+1];
for(ll i=l[belong[R]];i<=R;i++){
ret+=a[i];
ret%=p;
}
R=r[belong[R]-1];
for(ll i=belong[L];i<=belong[R];i++){
ret+=block[i];
ret%=p;
}
}
return ret;
}
void modify_plus(ll L,ll R,ll c){
push_down(belong[L]);
push_down(belong[R]);
if(belong[L]==belong[R]){
for(ll i=L;i<=R;i++){
a[i]=(a[i]+c)%p;
}
}else{
for(ll i=L;i<=r[belong[L]];i++){
a[i]=(a[i]+c)%p;
}
push_up(belong[L]);
L=l[belong[L]+1];
for(ll i=l[belong[R]];i<=R;i++){
a[i]=(a[i]+c)%p;
}
push_up(belong[R]);
R=r[belong[R]-1];
for(ll i=belong[L];i<=belong[R];i++){
block[i]=(block[i]+c*(r[i]-l[i]+1))%p;
lazy_plus[i]=(lazy_plus[i]+c)%p;
}
}
}
void modify_mul(ll L,ll R,ll c){
push_down(belong[L]);
push_down(belong[R]);
if(belong[L]==belong[R]){
for(ll i=L;i<=R;i++){
a[i]=(a[i]*c)%p;
}
}else{
for(ll i=L;i<=r[belong[L]];i++){
a[i]=(a[i]*c)%p;
}
push_up(belong[L]);
L=l[belong[L]+1];
for(ll i=l[belong[R]];i<=R;i++){
a[i]=(a[i]*c)%p;
}
push_up(belong[R]);
R=r[belong[R]-1];
for(ll i=belong[L];i<=belong[R];i++){
block[i]=(block[i]*c)%p;
lazy_mul[i]=(lazy_mul[i]*c)%p;
}
}
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
scanf("%lld%lld",&n,&p);
sqrtn=sqrt(n);
for(ll i=1;i<=n;i++){
scanf("%lld",a+i);
}
build();
scanf("%lld",&m);
while(m--){
ll op;
scanf("%lld",&op);
if(op==1){
ll l,r,c;
scanf("%lld%lld%lld",&l,&r,&c);
modify_mul(l,r,c);
}else if(op==2){
ll l,r,c;
scanf("%lld%lld%lld",&l,&r,&c);
modify_plus(l,r,c);
}else if(op==3){
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(l,r));
}
}
return 0;
}
/*5 38
1 5 4 2 3
5
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4*/
/*8 571373
5929 7152 8443 6028 8580 5449 8473 4237
10
2 4 8 4376
1 2 8 9637
2 2 6 7918
2 5 8 5681
3 2 8
1 1 5 6482
3 1 5
1 5 8 8701
2 5 8 7992
2 5 8 7806
*/