Cod sursa(job #1275265)

Utilizator diana97Diana Ghinea diana97 Data 24 noiembrie 2014 22:34:42
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f ("sequencequery.in");
ofstream g ("sequencequery.out");

struct Nod {
    long long prefix, sufix, suma, rezultat;
};

const int NMAX = 100000 + 1;

int n, m, a, b;
long long valoare, poz, sol;
Nod arb[4 * NMAX];

Nod nod_nou(Nod stanga, Nod dreapta) {
    Nod aux;
    aux.suma = stanga.suma + dreapta.suma;
    aux.prefix = max(stanga.prefix, stanga.suma + dreapta.prefix);
    aux.sufix = max(dreapta.sufix, dreapta.suma + stanga.sufix);
    aux.rezultat = max(stanga.rezultat, dreapta.rezultat);
    aux.rezultat = max(aux.rezultat, stanga.sufix + dreapta.prefix);
    return aux;
}

void update(int nod, int st, int dr) {
    if (st == dr) {
        arb[nod].prefix = arb[nod].sufix = arb[nod].suma = arb[nod].rezultat = valoare;
        return;
    }
    int m = (st + dr) / 2;
    if (poz <= m) update(2 * nod, st, m);
    else update(2 * nod + 1, m + 1, dr);
    arb[nod] = nod_nou(arb[2 * nod], arb[2 * nod + 1]);
}

Nod query(int nod, int st, int dr) {
    if (a <= st && dr <= b) return arb[nod];
    bool fiu_stang = false, fiu_drept = false;
    Nod stanga, dreapta;
    int m = (st + dr) / 2;
    if (a <= m) {
        fiu_stang = true;
        stanga = query(2 * nod, st, m);
    }
    if (m < b) {
        fiu_drept = true;
        dreapta = query(2 * nod + 1, m + 1, dr);
    }
    if (fiu_stang && fiu_drept) {
        return nod_nou(stanga, dreapta);
    }
    if (fiu_drept) return dreapta;
    return stanga;
}

void citeste() {
    f >> n >> m;
    for (int i = 1; i <= n; i++) {
        f >> valoare;
        poz = i;
        update(1, 1, n);
    }
}

void rezolva() {
    Nod sol;
    for (int i = 1; i <= m; i++) {
        f >> a >> b;
        sol = query(1, 1, n);
        g << sol.rezultat << '\n';
    }
}

int main() {
    citeste();
    rezolva();
    return 0;
}