Cod sursa(job #2145094)

Utilizator CammieCamelia Lazar Cammie Data 27 februarie 2018 08:45:20
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <fstream>

#define inf 6000000000LL
#define MAXN 100005

using namespace std;

ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");

struct str{
    long long ssm, st, dr, sum;
};

str INF = {-inf, -inf, -inf, -inf};

long long v[MAXN];
str ait[MAXN * 4];

inline void Build(int poz, int st, int dr) {
    if (st == dr) {
        ait[poz].ssm = ait[poz].st = ait[poz].dr = ait[poz].sum = v[st];
        return;
    }
    int mij = (st + dr) / 2;

    Build(poz * 2, st, mij);
    Build(poz * 2 + 1, mij + 1, dr);
    ait[poz].ssm = max(ait[poz * 2].ssm, max(ait[poz * 2 + 1].ssm, ait[poz * 2].dr + ait[poz * 2 + 1].st));
    ait[poz].st = max(ait[poz * 2].st, ait[poz * 2].sum + ait[poz * 2 + 1].st); ait[poz].dr = max(ait[poz * 2 + 1].dr, ait[poz * 2].dr + ait[poz * 2 + 1].sum);
    ait[poz].sum = ait[poz * 2].sum + ait[poz * 2 + 1].sum;
}

inline int IsEgal(str a1, str a2) {
    if (a1.ssm == a2.ssm && a1.st == a2.st && a1.dr == a2.dr && a1.sum == a2.sum)
        return 1;
    return 0;
}

str Query(int poz, int st, int dr, int ls, int ld) {
    if (ls <= st && dr <= ld) {
        return ait[poz];
    }
    if (st > ld || dr < ls) {
        return INF;
    }

    int mij = (st + dr) / 2;

    str aux1 = Query(poz * 2, st, mij, ls, ld);
    str aux2 = Query(poz * 2 + 1, mij + 1, dr, ls, ld);

    if (IsEgal(aux1, INF))
        return aux2;
    else if (IsEgal(aux2, INF))
        return aux1;
    else {
        long long maxi = max(aux1.ssm, max(aux2.ssm, aux1.dr + aux2.st));
        aux1.st = max(aux1.st, aux1.sum + aux2.st); aux2.dr = max(aux2.dr, aux2.sum + aux1.dr);
        return {maxi, aux1.st, aux2.dr};
    }
}

void Read() {
    int N, M; long long x, y; str aux;

    fin >> N >> M;

    for (int i = 1; i <= N; i++) {
        fin >> v[i];
    }

    Build(1, 1, N);

    while (M--) {
        fin >> x >> y;
        aux = Query(1, 1, N, x, y);

        fout << aux.ssm << "\n";
    }
}

int main () {
    Read();

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