Cod sursa(job #1275263)

Utilizator diana97Diana Ghinea diana97 Data 24 noiembrie 2014 22:28:13
Problema SequenceQuery Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <fstream>

using namespace std;

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

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

const int NMAX = 100000 + 1;

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

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].prefix = max(arb[2 * nod].prefix, arb[2 * nod + 1].prefix + arb[2 * nod].suma);
    arb[nod].sufix = max(arb[2 * nod + 1].sufix, arb[2 * nod].sufix + arb[2 * nod + 1].suma);
    arb[nod].suma = arb[2 * nod].suma + arb[2 * nod + 1].suma;
    arb[nod].rezultat = max(arb[2 * nod].rezultat, arb[2 * nod + 1].rezultat);
    arb[nod].rezultat = max(arb[nod].rezultat, arb[2 * nod].sufix + arb[2 * nod + 1].prefix);
}

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) {
        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;
    }
    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;
}