Cod sursa(job #1840153)

Utilizator MithrilBratu Andrei Mithril Data 3 ianuarie 2017 20:22:49
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 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;
        }
	}
}