Cod sursa(job #2441998)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 22 iulie 2019 13:24:50
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int v[100005], n, m;
struct arbint{
    long long s, smax, st, dr;
}a[300005];

void calculate(int nod, int st, int dr){
    if (st == dr){
        a[nod].s = v[st];
        a[nod].smax = v[st];
        a[nod].st = v[st];
        a[nod].dr = v[st];
        return;
    }
    int mij = (st + dr) >> 1;
    int ls = 2 * nod, rs = ls + 1;
    calculate(ls, st, mij);
    calculate(rs, mij + 1, dr);
    a[nod].s = a[ls].s + a[rs].s;
    a[nod].smax = max(max(a[ls].smax, a[rs].smax), a[ls].dr + a[rs].st);
    a[nod].st = max(a[ls].st, a[ls].s + a[rs].st);
    a[nod].dr = max(a[rs].dr, a[rs].s + a[ls].dr);
}

long long f(int nod, int st, int dr, int qs, int qd, int x){
    if (x == 1){
        if (qs <= st && dr <= qd)
            return a[nod].st;
        int mij = (st + dr) >> 1;
        int ls = 2 * nod, rs = ls + 1;
        long long sol = f(ls, st, mij, qs, qd, x);
        if (qd > mij)
            sol = max(sol, a[ls].s + f(rs, mij + 1, dr, qs, qd, x));
        return sol;
    }
    else if (x == 2){
        if (qs <= st && dr <= qd)
            return a[nod].dr;
        int mij = (st + dr) >> 1;
        int ls = 2 * nod, rs = ls + 1;
        long long sol = f(rs, mij + 1, dr, qs, qd, x);
        if (qs <= mij)
            sol = max(sol, a[rs].s + f(ls, st, mij, qs, qd, x));
        return sol;
    }
    else{
        if (qs <= st && dr <= qd)
            return a[nod].smax;
        if (dr < qs || st > qd)
            return 0;
        int mij = (st + dr) >> 1;
        int ls = 2 * nod, rs = ls + 1;
        long long a1 = f(ls, st, mij, qs, qd, x), a2 = f(rs, mij + 1, dr, qs, qd, x);
        if (qd <= mij)
            return a1;
        else if (qs > mij)
            return a2;
        else
            return max(max(a1, a2), f(ls, st, mij, qs, qd, 2) + f(rs, mij + 1, dr, qs, qd, 1));

    }
}

int main(){
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        fin >> v[i];
    calculate(1, 1, n);
    while (m--){
        int x, y;
        fin >> x >> y;
        fout << f(1, 1, n, x, y, 3) << '\n';
    }
    return 0;
}