21分求调,小错误玄关
查看原帖
21分求调,小错误玄关
1073342
Genshin_ZFYX楼主2025/1/14 14:31

都是很后面几行报错的,不知道是哪里出问题了

#include<bits/stdc++.h>
using namespace std;
//#define int long long
const int N=1e6+5;
int n,m,a[N],d[N];
struct node{
    int mi,ma;
    bool f;
}t[N<<2];
node M(node ls,node rs)
{
    node p;
    if(ls.ma<=rs.mi&&ls.f&&rs.f)p.f=true;
    else p.f=false;
    p.mi=min(ls.mi,rs.mi);
    p.ma=max(ls.ma,rs.ma);
    return p;
}
void push_down(int p)
{
    d[p<<1]=d[p<<1|1]=d[p];
    t[p<<1].mi+=d[p];t[p<<1].mi+=d[p];
    t[p<<1|1].mi+=d[p];t[p<<1|1].mi+=d[p];
}
void build(int p,int l,int r)
{
    if(l==r)
    {
        t[p].f=true;
        t[p].mi=t[p].ma=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    t[p]=M(t[p<<1],t[p<<1|1]);
}
node query(int p,int nl,int nr,int l,int r)
{
    if(l<=nl&&nr<=r)
        return t[p];
    int mid=(nl+nr)>>1;
    if(d[p])push_down(p);
    if(r<=mid)return query(p<<1,nl,mid,l,r);
    if(l>mid)return query(p<<1|1,mid+1,nr,l,r);
    node res,res1=query(p<<1,nl,mid,l,r),res2=query(p<<1|1,mid+1,nr,l,r);
    res=M(res1,res2);
    return res;
}
void update(int p,int nl,int nr,int l,int r,int x)
{
    if(l<=nl&&nr<=r)
    {
        t[p].mi+=x;t[p].ma+=x;
        d[p]+=x;
        return;
    }
    int mid=(nl+nr)>>1;
    if(d[p])push_down(p);
    if(l<=mid)update(p<<1,nl,mid,l,r,x);
    if(mid<r)update(p<<1|1,mid+1,nr,l,r,x);
    t[p]=M(t[p<<1],t[p<<1|1]);
}
signed main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    while(m--)
    {
        int op;cin>>op;
        if(op==1)
        {
            int l,r,x;cin>>l>>r>>x;
            if(r>n)r=n;
            update(1,1,n,l,r,x);
        }
        else{
            int l,r;cin>>l>>r;
            if(r>n)r=n;
            cout<<(query(1,1,n,l,r).f?"Yes":"No")<<'\n';
        }
    }
    cout<<endl;
    return 0;
}
2025/1/14 14:31
加载中...