1 条题解

  • 0
    @ 2021-6-15 13:33:53

    C++ :

    #include <cstdio>
    #include <cctype>
    #include <cstring>
    #define repu(i,x,y) for (int i=x; i<=y; ++i)
    #define lc x<<1
    #define rc x<<1|1
    #define mid ((l+r)>>1)
    using namespace std;
    
    int n,m,tot[524288],a[524288][20],ql,qr,w,ans;
    int s[200100];
    
    int getint()
    {
        char ch;
        while (!isdigit(ch=getchar()) && ch!='-');
        bool flag=ch=='-';
        if (flag)
            ch=getchar();
        int x=ch-'0';
        for (; isdigit(ch=getchar()); x=x*10+ch-'0');
        return flag?-x:x;
    }
    
    int cmp(int x,int y,int len)
    {
        repu(i,0,len-1)
        {
            if (s[x+i]<s[y+i])
                return -1;
            if (s[x+i]>s[y+i])
                return 1;
        }
        return 0;
    }
    
    void update(int x,int l,int r)
    {
        tot[x]=tot[rc],memcpy(a[x],a[rc],sizeof(a[x]));
        repu(i,1,tot[lc])
            while (1)
            {
                int u=a[lc][i],v=a[x][tot[x]],t=cmp(u,v,r-v+1);
                if (t==1)
                    break;
                if (!t)
                {
                    if (2*(r-v+1)>r-u+1)
                        --tot[x];
                    a[x][++tot[x]]=u;
                    break;
                }
                if (!--tot[x])
                {
                    a[x][++tot[x]]=u;
                    break;
                }
            }
    }
    
    void build(int x,int l,int r)
    {
        if (l==r)
        {
            a[x][tot[x]=1]=l;
            return;
        }
        build(lc,l,mid),build(rc,mid+1,r);
        update(x,l,r);
    }
    
    void query(int x,int l,int r)
    {
        if (ql<=l && qr>=r)
        {
            repu(i,1,tot[x])
                if (cmp(a[x][i],ans,qr-ans+1)==-1)
                    ans=a[x][i];
            return;
        }
        if (qr>mid)
            query(rc,mid+1,r);
        if (ql<=mid)
            query(lc,l,mid);
    }
    
    void modify(int x,int l,int r)
    {
        if (ql<=l && qr>=r)
            return;
        if (ql<=mid)
            modify(lc,l,mid);
        if (qr>mid)
            modify(rc,mid+1,r);
        update(x,l,r);
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        repu(i,1,n)
            s[i]=getint();
        build(1,1,n);
        while (m--)
            if (getint()==1)
            {
                ql=getint(),qr=getint(),w=getint();
                repu(i,ql,qr)
                    s[i]+=w;
                modify(1,1,n);
            }
            else
            {
                ql=getint(),qr=ans=getint();
                query(1,1,n),printf("%d\n",ans);
            }
        return 0;
    }
    
    • 1

    信息

    ID
    941
    时间
    5000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者