Cod sursa(job #1849526)

Utilizator MithrilBratu Andrei Mithril Data 17 ianuarie 2017 17:28:28
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda gym_emag_avansati_2016 Marime 1.93 kb
#include <bits/stdc++.h>
#define MAX_N (100000)
 
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int n,m,aux;
struct Arb{long long S,D,C,Sum;}Ar[MAX_N*4];
void build(int,int,int);
void update(int,int,int,int,int);
Arb query(int,int,int,int,int);
 
int main()
{
    int v1,v2;
    fin>>n>>m;
    build(1, 1, n);
    for(int i=1;i<=m;i+=1)
    {
        fin>>v1>>v2;
        fout<<query(1,1,n,v1,v2).C<<'\n';
    }
    return 0;
}
 
void build(int n, int l, int r)
{
    if (l == r)
    {
        int aux;
        fin>>aux;
        Ar[n].S = Ar[n].D = Ar[n].C = aux;
        Ar[n].Sum = aux;
    }
    else
    {
        int leftNode=n<<1,rightNode=n<<1|1,middle=(l+r)>>1;
 
        build(leftNode, l, middle);
        build(rightNode, middle+1, r);
 
        Ar[n].C = max(max(Ar[leftNode].C, Ar[rightNode].C), Ar[leftNode].D+Ar[rightNode].S);
        Ar[n].D = max(Ar[leftNode].D+Ar[rightNode].Sum, Ar[rightNode].D);
        Ar[n].S = max(Ar[leftNode].S, Ar[leftNode].Sum + Ar[rightNode].S );
        Ar[n].Sum = Ar[leftNode].Sum+Ar[rightNode].Sum;
    }
}
 
Arb query(int n, int l, int r, int a, int b)
{
    if (a <= l && r <= b) return Ar[n];
    else
    {
        int leftNode=n<<1,rightNode=n<<1|1,middle=(l+r)>>1;
 
        if(b<=middle) return query(leftNode,l,middle,a,b);
        else if(a>middle) return query(rightNode,middle+1,r,a,b);
        else
        {
            Arb leftInterval = query(leftNode,l,middle,a,b);
            Arb rightInterval = query(rightNode,middle+1,r,a,b);
            Arb aux;
            aux.C = max(max(leftInterval.C, rightInterval.C), leftInterval.D+rightInterval.S);
            aux.S = max(leftInterval.Sum+rightInterval.S, leftInterval.S);
            aux.D = max(rightInterval.Sum+leftInterval.D, rightInterval.D);
            aux.Sum = leftInterval.Sum+rightInterval.Sum;
 
            return aux;
        }
    }
}