Cod sursa(job #2503710)

Utilizator victorv88Veltan Victor victorv88 Data 3 decembrie 2019 18:12:20
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin("test.in");
ofstream g("sequencequery.out");

struct arb{
    int prefix, s_tot, sufix;
}tree[100005],aux;

int n, m, x, stq, drq;

void adaugare_tree(int st, int dr, int ind, int val, int i)
{
    if (st==dr)
    {
        tree[ind].prefix=tree[ind].s_tot=tree[ind].sufix=val;
        return;
    }
    int mij=(st+dr)/2;
    if (mij<i)
        adaugare_tree(mij+1,dr,ind*2+1,val,i);
    else
        adaugare_tree(st,mij,ind*2,val,i);
}

void formare_tree(int st, int dr, int ind)
{
    if (st==dr)
        return;
    int mij=(st+dr)/2;
    formare_tree(mij+1,dr,ind*2+1);
    formare_tree(st,mij,ind*2);
    tree[ind].s_tot=tree[ind*2].s_tot+tree[ind*2+1].s_tot;
    tree[ind].prefix=max(tree[ind*2].prefix,tree[ind*2].s_tot+tree[ind*2+1].prefix);
    tree[ind].sufix=max(tree[ind*2+1].sufix,tree[ind*2+1].s_tot+tree[ind*2].sufix);
}

arb query(int st, int dr, int ind, int stq, int drq)
{
    if (st>drq || dr<stq)
        {
            arb a;
            a.prefix=a.sufix=a.s_tot=-999999;
            return a;
        }
    if (st>=stq && dr<=drq)
        return tree[ind];
    int mij=(st+dr)/2;
    arb a = query(st,mij,ind*2,stq,drq);
    arb b= query(mij+1,dr,ind*2+1,stq,drq);
    if (ind==1)
    {
        g << max(a.sufix,max(a.prefix,max(a.sufix+b.prefix,max(b.sufix,b.prefix))));
        g << '\n';
    }
    arb r;
    r.s_tot=a.s_tot+b.s_tot;
    r.prefix=max(a.prefix,a.s_tot+b.prefix);
    r.sufix=max(b.sufix,a.sufix+b.s_tot);
    return r;
}

arb gasire(int st, int dr, int ind, int cautat)
{
    if (st==dr)
        return tree[ind];
    int mij=(st+dr)/2;
    if (mij<cautat)
        return gasire(mij+1,dr,ind*2+1,cautat);
    return gasire(st,mij,ind*2,cautat);
}

int main()
{
    fin >> n >> m;
    for (int i=1; i<=n; ++i)
    {
        fin >> x;
        adaugare_tree(1,n,1,x, i);
    }
    formare_tree(1,n,1);
    for (int i=1; i<=m; ++i)
    {
        fin >> stq >> drq;
        aux.prefix=aux.sufix=aux.s_tot=0;
        if (stq==drq)
            g<<gasire(1,n,1,stq).s_tot << '\n';
        else
            query(1,n,1,stq,drq);
    }
    return 0;
}