Cod sursa(job #1602446)

Utilizator andytosaAndrei Tosa andytosa Data 16 februarie 2016 19:43:55
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <iostream>
#include <climits>
#define sub -2000000
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");

int v[400000];
int n, m, pos, val, start, stop;
__int64 sum;
void update(int nod, int left, int right){
    if(left == right){
        v[nod] = val;
        return;
    }

    int mij = (left + right) / 2;
    if(pos <= mij)
        update(nod * 2, left, mij);
    else
        update(nod * 2 + 1, mij + 1, right);

    v[nod] = max(v[2 * nod], v[2 * nod + 1]);
    v[nod] = max(v[nod], v[2 * nod] + v[2 * nod + 1]);
}
void query(int nod, int left, int right){
    if(left > stop || right < start){
        return;
    }

    if(start <= left && right <= stop){
        sum = max(1LL * v[nod], sum + v[nod]);
        return;
    }

    int mij = (left + right) / 2;
    query(nod * 2, left, mij);
    query(nod * 2 + 1, mij + 1, right);
}
int main()
{
    //for(int i = 1; i <= n; ++i) v[i] = sub;

    fin >> n >> m;
    for(int i = 1; i <= n; ++i){
        fin >> val;
        pos = i;
        update(1, 1, n);
    }
    //for(int i = 1; i <= 2 * n; ++i)
        //fout << v[i] << ' ';

    for(int i = 1; i <= m; ++i){
        fin >> start >> stop;
        sum = INT_MIN;
        query(1, 1, n);
        fout << sum << '\n';
    }
    return 0;
}