제출 #524610

#제출 시각아이디문제언어결과실행 시간메모리
524610lucriSimple (info1cup19_simple)C++17
100 / 100
355 ms32636 KiB
#include <iostream>
#define int long long
#define inf 1000000000000000000
using namespace std;
int n,q,val,tip,a,b,v[200010],lazy[3600010];
struct {int pmin,pmax,imin,imax;}aint[3600010];
void build(int poz,int l,int r)
{
    aint[poz].pmin=inf;
    aint[poz].imin=inf+1;
    aint[poz].pmax=-inf;
    aint[poz].imax=-inf-1;
    if(l==r)
    {
        if(v[l]%2==0)
        {
            aint[poz].pmax=v[l];
            aint[poz].pmin=v[l];
        }
        else
        {
            aint[poz].imax=v[l];
            aint[poz].imin=v[l];
        }
        return;
    }
    if(l>r)
        return;
    int m=(l+r)/2;
    build(poz*2,l,m);
    build(poz*2+1,m+1,r);
    aint[poz].pmax=max(aint[poz*2].pmax,aint[poz*2+1].pmax);
    aint[poz].imax=max(aint[poz*2].imax,aint[poz*2+1].imax);
    aint[poz].imin=min(aint[poz*2].imin,aint[poz*2+1].imin);
    aint[poz].pmin=min(aint[poz*2].pmin,aint[poz*2+1].pmin);
    return;
}
void update(int poz,int l,int r,int a,int b,int val)
{
    if(r<a||l>b)
    {
        aint[poz].imax+=lazy[poz];
        aint[poz].pmax+=lazy[poz];
        aint[poz].pmin+=lazy[poz];
        aint[poz].imin+=lazy[poz];
        if(aint[poz].imin%2==0)
        {
            swap(aint[poz].imin,aint[poz].pmin);
            swap(aint[poz].imax,aint[poz].pmax);
        }
        if(l<r)
        {
            lazy[poz*2]+=lazy[poz];
            lazy[poz*2+1]+=lazy[poz];
        }
        lazy[poz]=0;
        return;
    }
    if(a<=l&&r<=b)
    {
        aint[poz].imax+=val+lazy[poz];
        aint[poz].pmax+=val+lazy[poz];
        aint[poz].pmin+=val+lazy[poz];
        aint[poz].imin+=val+lazy[poz];
        if(aint[poz].imin%2==0)
        {
            swap(aint[poz].imin,aint[poz].pmin);
            swap(aint[poz].imax,aint[poz].pmax);
        }
        if(l<r)
        {
            lazy[poz*2]+=lazy[poz]+val;
            lazy[poz*2+1]+=lazy[poz]+val;
        }
        lazy[poz]=0;
        return;
    }
    lazy[poz*2]+=lazy[poz];
    lazy[poz*2+1]+=lazy[poz];
    lazy[poz]=0;
    int m=(l+r)/2;
    update(poz*2,l,m,a,b,val);
    update(poz*2+1,m+1,r,a,b,val);
    aint[poz].pmax=max(aint[poz*2].pmax,aint[poz*2+1].pmax);
    aint[poz].imax=max(aint[poz*2].imax,aint[poz*2+1].imax);
    aint[poz].imin=min(aint[poz*2].imin,aint[poz*2+1].imin);
    aint[poz].pmin=min(aint[poz*2].pmin,aint[poz*2+1].pmin);
    return;
}
void raspuns(int poz,int l,int r,int a,int b,int &minpar,int &maximpar)
{
    if(r<a||l>b)
    {
        aint[poz].imax+=lazy[poz];
        aint[poz].pmax+=lazy[poz];
        aint[poz].pmin+=lazy[poz];
        aint[poz].imin+=lazy[poz];
        if(aint[poz].imin%2==0)
        {
            swap(aint[poz].imin,aint[poz].pmin);
            swap(aint[poz].imax,aint[poz].pmax);
        }
        if(l<r)
        {
            lazy[poz*2]+=lazy[poz];
            lazy[poz*2+1]+=lazy[poz];
        }
        lazy[poz]=0;
        return;
    }
    if(a<=l&&r<=b)
    {
        aint[poz].imax+=lazy[poz];
        aint[poz].pmax+=lazy[poz];
        aint[poz].pmin+=lazy[poz];
        aint[poz].imin+=lazy[poz];
        if(aint[poz].imin%2==0)
        {
            swap(aint[poz].imin,aint[poz].pmin);
            swap(aint[poz].imax,aint[poz].pmax);
        }
        if(l<r)
        {
            lazy[poz*2]+=lazy[poz];
            lazy[poz*2+1]+=lazy[poz];
        }
        lazy[poz]=0;
        maximpar=max(maximpar,aint[poz].imax);
        minpar=min(minpar,aint[poz].pmin);
        return;
    }
    lazy[poz*2]+=lazy[poz];
    lazy[poz*2+1]+=lazy[poz];
    lazy[poz]=0;
    int m=(l+r)/2;
    raspuns(poz*2,l,m,a,b,minpar,maximpar);
    raspuns(poz*2+1,m+1,r,a,b,minpar,maximpar);
    aint[poz].pmax=max(aint[poz*2].pmax,aint[poz*2+1].pmax);
    aint[poz].imax=max(aint[poz*2].imax,aint[poz*2+1].imax);
    aint[poz].imin=min(aint[poz*2].imin,aint[poz*2+1].imin);
    aint[poz].pmin=min(aint[poz*2].pmin,aint[poz*2+1].pmin);
    return;
}
main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n;
    for(int i=1;i<=n;++i)
        cin>>v[i];
    build(1,1,n);
    cin>>q;
    while(q--)
    {
        cin>>tip>>a>>b;
        if(tip==0)
        {
            cin>>val;
            update(1,1,n,a,b,val);
        }
        else
        {
            int minpar=inf,maximpar=-inf;
            raspuns(1,1,n,a,b,minpar,maximpar);
            if(minpar>400000000000000)
                cout<<-1<<' ';
            else
                cout<<minpar<<' ';
            if(maximpar<0)
                cout<<-1<<'\n';
            else
                cout<<maximpar<<'\n';
        }
    }
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

subway.cpp:144:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  144 | main()
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...