Cod sursa(job #2871172)

Utilizator Mihai_EduardMihai Eduard Mihai_Eduard Data 12 martie 2022 23:27:56
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <bits/stdc++.h>

typedef long long ll;
using namespace std;

ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
const int NMAX=100005;

///smax-valoarea subsecventei de suma maxima in intervalul dat de nodul arborelui de intervale
///mx-cea mai mare valoare pentru sum[i] in intervalul dat de nodul arborelui de intervale
///mn-cea mai mica valoare pentru sum[i-1] in intervalul dat de nodul arborelui de intervale
int N, M;
ll sum[NMAX], minPref;
struct node{
    ll smax, mx, mn;
}seg[4*NMAX];

void build(int nod, int st, int dr){
    if(st==dr){
        seg[nod]={sum[st]-sum[st-1],sum[st],sum[st-1]};
        return;
    }
    int mij=(st+dr)/2;
    build(nod*2,st,mij);
    build(nod*2+1,mij+1,dr);
    seg[nod].mx=max(seg[nod*2].mx,seg[nod*2+1].mx);
    seg[nod].mn=min(seg[nod*2].mn,seg[nod*2+1].mn);
    seg[nod].smax=max(max(seg[nod*2].smax,seg[nod*2+1].smax),seg[nod*2+1].mx-seg[nod*2].mn);
}

ll query(int nod, int st, int dr, int p1, int p2){
    if(st>=p1 and dr<=p2){
        ll sol=seg[nod].smax;
        if(minPref!=LLONG_MAX)
            sol=max(sol,seg[nod].mx-minPref);
        minPref=min(minPref,seg[nod].mn);
        return sol;
    }
    int mij=(st+dr)/2;
    if(p1<=mij and p2>mij)
        return max(query(nod*2+1,mij+1,dr,p1,p2),query(nod*2,st,mij,p1,p2));
    if(p1<=mij)
        return query(nod*2,st,mij,p1,p2);
    return query(nod*2+1,mij+1,dr,p1,p2);
}

int main()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++){
        fin>>sum[i];
        sum[i]+=sum[i-1];
    }
    build(1,1,N);

    int x, y;
    while(M--){
        fin>>x>>y;
        minPref=LLONG_MAX;
        fout<<query(1,1,N,x,y)<<'\n';
    }

    fin.close();
    fout.close();
    return 0;
}