Cod sursa(job #1277741)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 28 noiembrie 2014 01:38:16
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <fstream>
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int i, n, m, x, a, b; long long INF = 2000000000;
struct sQuery{
    long long S, st, dr, Ssecv;
} v[4 * 100010], sol_global;
long long maxim(long long a, long long b)
{
    if( a > b)
        return a;
    return b;
}
void update(int nod, int st, int dr, int poz, int x){
    if(st == dr){
        v[nod].S = x; v[nod].st = x; v[nod].dr = x; v[nod].Ssecv = x;
        return;
    }
    int mid = (st + dr) / 2;
    if(poz <= mid)
        update(2 * nod, st, mid, poz, x);
    else
        update(2 * nod + 1, mid + 1, dr, poz, x);
    v[nod].st = maxim( v[2 * nod].st, v[2*nod].S + v[2 * nod + 1].st );
    v[nod].dr = maxim( v[2 * nod + 1].dr ,v[2 * nod  + 1].S + v[2 * nod].dr );
    v[nod].Ssecv=maxim( v[2 * nod].Ssecv, maxim(v[2 * nod + 1].Ssecv, v[2 * nod].dr + v[2 * nod + 1].st ) );
    long long sum = 0;
    if(v[2 * nod].S != -INF && v[2 * nod + 1].S != -INF)
        sum = v[2 * nod].S + v[2 * nod + 1].S;
    else
        sum = v[2 * nod].S + v[2 * nod + 1].S + INF;
        v[nod].S = sum;
}
sQuery query(int nod, int p, int u, int a, int b)
{
    sQuery s_st; sQuery s_dr;
    sQuery sol;
    if(a <= p && u <= b)
    {
        return v[nod];
    }
    int m = ( p + u) / 2;
    int ok_st = 0,  ok_dr = 0;
    if(a <= m){
        s_st = query(2 * nod, p, m , a, b);
        ok_st = 1;
    }
    if(m < b){
        s_dr = query(2 * nod + 1, m + 1, u, a, b);
        ok_dr = 1;
    }
    if(ok_st && ok_dr){
        sol.S = s_st.S + s_dr.S;
        sol.st = max(s_st.st, s_st.S + s_dr.st);
        sol.dr = max(s_dr.dr, s_dr.S + s_st.dr);
        sol.Ssecv = max(s_st.Ssecv, max(s_dr.Ssecv, s_st.dr + s_dr.st));
        return sol;
    }
    else
        if(ok_st)
            return s_st;
        else
            return s_dr;
}
int main()
{
    fin >> n >> m;
    for(i = 1; i <= 4 * n; i ++)
    {
     v[i].S = v[i].st = v[i].dr = v[i].Ssecv = -INF;
    }
    for(i = 1; i <= n; i ++)
    {
        fin >> x;
        update(1, 1, n, i, x);
    }
    for(i = 1; i <= m; i ++)
    {
        fin >> a >> b;
        sol_global = query(1,1,n,a,b);
        fout << sol_global.Ssecv << '\n';
    }
    return 0;
}