Cod sursa(job #3339079)

Utilizator IleaIlea Bogdan Ilea Data 6 februarie 2026 09:38:07
Problema SequenceQuery Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#include<iostream>
#include<bitset>
using namespace std;

#define NMAX 100001
#define lb b[0]

struct _{
    int pf=0,sf=0,mx=0,al=0;
    auto operator=(const int&x)->void{
        this->pf=x;
        this->sf=x;
        this->mx=x;
        this->al=x;
        return;
    }
    friend auto operator+(const _&_1,const _&_2)->_{
        _ _3;
        _3=0;
        _3.al=_1.al+_2.al;
        _3.pf=max(_1.pf,_1.al+_2.pf);
        _3.sf=max(_2.sf,_1.sf+_2.al);
        _3.mx=max(_1.mx,_2.mx);
        _3.mx=max(_3.mx,_3.al);
        _3.mx=max(_3.mx,_3.sf);
        _3.mx=max(_3.mx,_3.pf);
        _3.mx=max(_3.mx,_1.sf+_2.pf);

        _3.al=_1.al+_2.al;
        _3.pf=max(_1.pf,_1.al+_2.pf);
        _3.sf=max(_2.sf,_1.sf+_2.al);
        _3.mx=max(_1.mx,_2.mx);
        _3.mx=max(_3.mx,_3.al);
        _3.mx=max(_3.mx,_3.sf);
        _3.mx=max(_3.mx,_3.pf);
        _3.mx=max(_3.mx,_1.sf+_2.pf);
        return _3;
    }
    auto operator+=(const _&__)->void{
        *this=*this+__;
    }
    friend auto operator<<(ostream&out,const _&__)->ostream&{
        out<<max(__.al,max(__.pf,max(__.sf,__.mx)));
        return out;
    }
    friend auto operator>>(istream&in,_&__)->istream&{
        int x;
        in>>x;
        __=x;
        return in;
    }
}aint[4*NMAX],ans;
int n,q;
bitset<1>b;
auto init(int nod,int st,int dr)->void{
    if(st==dr){
        cin>>aint[nod];
        return;
    }
    int mij=(st+dr)/2;
    init(2*nod,st,mij);
    init(2*nod+1,mij+1,dr);
    aint[nod]=aint[2*nod]+aint[2*nod+1];
}
auto query(int nod,int st,int dr,const int&x,const int&y)->void{
    if(y<st||dr<x)return;
    if(x<=st&&dr<=y){
        if(!lb){
            lb=true;
            ans=aint[nod];
            return;
        }
        ans+=aint[nod];
        return;
    }
    int mij=(st+dr)/2;
    query(2*nod,st,mij,x,y);
    query(2*nod+1,mij+1,dr,x,y);
}
auto print(int nod,int st,int dr)->void{
    cout<<aint[nod].al<<" ";
    if(dr==n)cout<<endl;
    if(st==dr)return;
    int mij=(st+dr)/2;
    print(2*nod,st,mij);
    print(2*nod+1,mij+1,dr);
}
auto main(void)->signed{
    #ifndef LOCAL
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
    #endif // LOCAL
    freopen("sequencequery.in","r",stdin);
    freopen("sequencequery.out","w",stdout);
    cin>>n>>q;
    init(1,1,n);
    // print(1,1,n);
    for(;q;--q){
        int x,y;
        cin>>x>>y;
        if(x>y)swap(x,y);
        ans=0;
        lb=false;
        query(1,1,n,x,y);
        cout<<ans<<"\n";
    }
    return 0;
}