求助 线段树 能过样例 实际全WA 找不出错
查看原帖
求助 线段树 能过样例 实际全WA 找不出错
446327
mukari楼主2022/7/26 21:44

rt

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ma 114514
using namespace std;
ll read(){
    char ch=getchar();
    ll x=0,f=1;
    while(ch<'0'||ch>'9')
        {
        if(ch=='-')
            f=-1;
        ch=getchar();
        }
    while(ch>='0'&&ch<='9')
        {
        x=x*10+ch-'0';
        ch=getchar();
        }
    return x*f;
}
ll mo;
ll n,m;
ll a[ma];
struct tree{
  ll v,mu,ad;
}t[4*ma];
void build(ll p,ll l,ll r){
  t[p].mu=1;
  t[p].ad=0;
  if(l==r){
    t[p].v=a[l];
  }
  else{
    ll mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    t[p].v=t[p*2].v+t[p*2+1].v;
  }
  t[p].v%=mo;
  return;
}
void down(ll p,ll l,ll r){
  ll mid=(l+r)/2;
  t[p*2].v=(t[p*2].v*t[p].mu+t[p].ad*(mid-l+1))%mo;
  t[p*2+1].v=(t[p*2+1].v*t[p].mu+t[p].ad*(r-mid))%mo;
  t[p*2].mu=(t[p*2].mu*t[p].mu)%mo;
  t[p*2+1].mu=(t[p*2+1].mu*t[p].mu)%mo;
  t[p*2].ad=(t[p*2].ad*t[p].mu+t[p].ad)%mo;
  t[p*2+1].ad=(t[p*2+1].ad*t[p].mu+t[p].ad)%mo;
  t[p].mu=1;
  t[p].ad=0;
  return;
}
void updatemu(ll p,ll l,ll r,ll x,ll y,ll k){
  if(y<l||r<x) return;
  if(x<=l&&r<=y){
    t[p].v=(t[p].v*k)%mo;
    t[p].mu=(t[p].mu*k)%mo;
    t[p].ad=(t[p].ad*k)&mo;
    return;
  }
  down(p,l,r);
  ll mid=(l+r)/2;
  updatemu(p*2,l,mid,x,y,k);
  updatemu(p*2+1,mid+1,r,x,y,k);
  t[p].v=(t[p*2].v+t[p*2+1].v)%mo;
  return;
}
void updatead(ll p,ll l,ll r,ll x,ll y,ll k){
  if(y<l||r<x) return;
  if(x<=l&&r<=y){
    t[p].ad=(t[p].ad+k)%mo;
    t[p].v=(t[p].v+k*(r-l+1))%mo;
    return;
  }
  down(p,l,r);
  ll mid=(l+r)/2;
  updatead(p*2,l,mid,x,y,k);
  updatead(p*2+1,mid+1,r,x,y,k);
  t[p].v=(t[p*2].v+t[p*2+1].v)%mo;
  return;
}
ll ask(ll p,ll l,ll r,ll x,ll y){
  if(y<l||r<x) return 0;
  if(x<=l&&r<=y){
    return t[p].v;
  }
  down(p,l,r);
  ll mid=(l+r)/2;
  return (ask(p*2,l,mid,x,y)+ask(p*2+1,mid+1,r,x,y))%mo;
}
int main(){
  n=read(),m=read(),mo=read();
  for(ll i=1;i<=n;i++) a[i]=read();
  build(1,1,n);
  for(ll i=1;i<=m;i++){
    ll op,x,y,k;
    op=read();
    if(op==1){
      x=read(),y=read(),k=read();
      updatemu(1,1,n,x,y,k);
    }
    else if(op==2){
      x=read(),y=read(),k=read();
      updatead(1,1,n,x,y,k);
    }
    else{
      x=read(),y=read();
      cout<<ask(1,1,n,x,y)%mo<<endl;
    }
  }
  return 0;
}

救命,找半天了

能指出错误的话本人不胜感激

2022/7/26 21:44
加载中...