Cod sursa(job #3306245)

Utilizator ioanxhIoan Budeanu ioanxh Data 8 august 2025 18:06:51
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops,inline")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define fast ios_base::sync_with_stdio(0);f.tie(0);g.tie(0);
#define setinf(x) memset(x,63,sizeof(x));
#define set0(x) memset(x,0,sizeof(x));
#define all(x) x.begin(),x.end()
#define tiii tuple<int,int,int>
#define pii pair<int,int>
#define vi vector<int>
#define ll long long
#define vll vector<ll>
#define pb push_back
#define fi first
#define se second
#define DD 100001
#define nl '\n'
using namespace std;
const string file="sequencequery";
ifstream f(file+".in");
ofstream g(file+".out");
//#define f cin
//#define g cout
struct  aint {
    struct xy {
        ll s,smax,pf,sf;
    };
    vector<xy> v;
    int n;
    aint(int _n) {
        n=_n;
        v.resize(n*4);
    }
    xy comb(xy st, xy dr) {
        xy x;
        x.s=st.s+dr.s;
        x.pf=max(st.pf,st.s+dr.pf);
        x.sf=max(dr.sf,dr.s+st.sf);
        x.smax=max({st.smax,dr.smax,st.sf+dr.pf});
        return x;
    }
    void build(int nod, int st, int dr) {
        if (st==dr) {
            int x;
            f>>x;
            v[nod].s=v[nod].pf=v[nod].sf=v[nod].smax=x;
            return;
        }
        int mid=(st+dr)>>1;
        build(nod*2,st,mid);
        build(nod*2+1,mid+1,dr);
        v[nod]=comb(v[nod*2],v[nod*2+1]);
    }
    xy query(int nod, int st, int dr, int l, int r) {
        if (l<=st && dr<=r) return v[nod];
        int mid=(st+dr)>>1;
        if (r<=mid) return query(nod*2,st,mid,l,r);
        if (l>mid) return query(nod*2+1,mid+1,dr,l,r);
        xy L=query(2*nod,st,mid,l,r);
        xy R=query(2*nod+1,mid+1,dr,l,r);
        return comb(L,R);
    }
};
int main(){
    int n,q;
    f>>n>>q;
    aint v(n);
    v.build(1,1,n);
    while(q--) {
        int x,y;
        f>>x>>y;
        g<<v.query(1,1,n,x,y).smax<<nl;
    }
    system("pause");
    return 0;
}