Cod sursa(job #2051390)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 28 octombrie 2017 21:52:06
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <stdio.h>
#include <climits>
using namespace std;
FILE *fin = fopen("sequencequery.in", "r");
FILE *fout = fopen("sequencequery.out", "w");
long long val;
int poz;
int start, finish;
long long curent;
long long rezultat;
struct arbore
{
    long long all, beg, mid, fin;
};
arbore sec[400000];
long long maxim(long long x, long long y)
{
    if(x > y) return x;
    return y;
}
void update(int nod, int st, int dr)
{
    if(st == dr)
    {
        sec[nod].all = val;
        sec[nod].beg = val;
        sec[nod].fin = val;
        sec[nod].mid = val;
        return;
    }
    else
    {
        int mij = (st + dr)/2;
        if(poz <= mij) update(2*nod, st, mij);
        else update(2*nod+1, mij+1, dr);
        sec[nod].all = sec[2*nod].all + sec[2*nod+1].all;
        sec[nod].beg = maxim(maxim(sec[2*nod].beg , sec[2*nod].all+sec[2*nod+1].beg),sec[2*nod+1].all+sec[2*nod].all);
        sec[nod].mid = maxim(maxim(maxim(sec[2*nod].mid , sec[2*nod+1].mid), sec[2*nod].fin+sec[2*nod+1].beg),sec[2*nod+1].all+sec[2*nod].all);
        sec[nod].fin=maxim(maxim(sec[2*nod+1].fin , sec[2*nod+1].all+sec[2*nod].fin), sec[2*nod+1].all+sec[2*nod].all);
    }
}
void intrebare(int nod, int st, int dr)
{
    if(start<=st && finish>=dr)
    {
        rezultat = maxim( rezultat, maxim( curent + sec[nod].beg, sec[nod].mid ) ) ;
        curent = maxim ( curent + sec[nod].all, sec[nod].fin ) ;
        return;
    }
    int mij = st + dr;
    mij /= 2;
    if (start <= mij) intrebare(2*nod, st, mij);
    if (mij < finish) intrebare(2*nod+1, mij+1, dr);
}
int main()
{
    int n,q;
    fscanf(fin, "%d%d", &n, &q);
    for(int i=1;i<=n;i++)
    {
        poz = i;
        fscanf(fin, "%lld", &val);
        update(1,1,n);
    }
    for(int j=1;j<=q;j++)
    {
        int a, b;
        fscanf(fin , "%d%d", &a, &b);
        curent = 0;
        rezultat = LLONG_MIN;
        start = a;
        finish = b;
        intrebare(1,1,n);
        fprintf(fout,  "%lld\n", rezultat);
    }
    return 0;
}