Cod sursa(job #2434745)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 2 iulie 2019 14:08:37
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>
#define maxim 100008


using namespace std;


ifstream f("sequencequery.in");
ofstream g ("sequencequery.out");

const long long  inf=1e10;

struct
{
    long long  max,st,dr,sum;
} tree[maxim<<2];

int n,v[maxim],m;

long long maxi ( long long a ,  long long b, long long c)
{
    return max(a,max(b,c));
}


void create(int nod, int i, int  j)
{
    if (i == j)
        tree[nod]={v[i],v[i],v[i],v[i]};
    else
    {
        int mij=(i+j)/2;
        create(nod*2, i, mij);
        create(nod*2+1, mij+1, j);

        tree[nod].sum = tree[nod*2].sum + tree[nod*2+1].sum;
        tree[nod].max = maxi( tree[nod*2].max, tree[nod*2+1].max, tree[nod*2].dr + tree[nod*2+1].st );
        tree[nod].st  = max( tree[nod*2].st, tree[nod*2].sum + tree[nod*2+1].st);
        tree[nod].dr  = max (tree[nod*2+1].dr , tree[nod*2+1].sum + tree[nod*2].dr);
    }
}


long long  ans,dreapta;

void query(int nod, int i, int j, const int a, const int b)
{
    if (a <= i && b>= j) //inclus complet
    {
       ans=maxi(ans,tree[nod].max,dreapta+tree[nod].st);
       dreapta=max(tree[nod].dr, dreapta+tree[nod].sum);
    }
    else
    {
        int mij=(i+j)/2;
        if (a <= mij)
            query(nod*2, i, mij, a, b);
        if (b > mij)
            query(nod*2+1, mij+1, j, a, b);

    }
}

int main()
{


    f>>n>>m;
    for (int i=1 ; i<=n ; i++)
        f>>v[i];
    create(1,1,n);
    while(m--)
    {
        int a,b;
        f>>a>>b;
        ans=-inf;
        dreapta=0;
        query(1, 1, n, a, b);
        g<<ans<<'\n';
    }


}