Cod sursa(job #1277265)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 27 noiembrie 2014 14:25:06
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#define DIM 100010
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");

int i, n, m, x, a, b;
struct sQuery{
	long long S, st, dr, Ssecv;
} v[4 * DIM], sol_global;
void update(int nod, int p, int u, int poz, int x)
{
	if(p == u)
	{
		v[nod].S = x;
		v[nod].st = x;
		v[nod].dr = x;
		v[nod].Ssecv = x;
		return;
	}
	int m = (p + u) / 2;
	if(p <= m)
		update(2 * nod, p, m, poz, x);
	else
		update(2 * nod, m + 1, u, poz, x);

	v[nod].S = v[2 * nod].S + v[2 * nod + 1].S;
	v[nod].st = max(v[2 * nod].st, v[2 * nod].S + v[2 * nod + 1].st);
	v[nod].dr = max(v[2* nod + 1].dr, v[2* nod + 1].S + v[2 * nod].dr);
	v[nod].Ssecv = max(v[2 * nod].Ssecv, max(v[2 * nod + 1].Ssecv, v[2 * nod].dr + v[2*nod + 1].st));

}
sQuery query(int nod, int p, int u, int a, int b)
{
	if(a <= p && u <= b)
	{
		return v[nod];
	}
	m = ( p + u) / 2;
	int ok_st = 0,  ok_dr = 0;
	if(a <= m){
		sQuery s_st = query(2 * nod, p, m , a, b);
		ok_st = 1;
	}
	if(m < b){
		sQuery s_dr = query(2 * nod + 1, m + 1, u, a, b);
		ok_dr = 1;
	}
	if(ok_st && ok_dr){
		sQuery sol = 0;
		sol.S = s_st.S + s_dr.S;
		sol.st = max(s_st.st, s_st.S + s_dr.st);
		sol.dr = max(s_dr.dr, s_dr.S + s_st.dr);
		sol_Ssecv = max(s_st.Ssecv, max(s_dr.Ssecv, s_st.dr + s_dr.st));
		return sol;
	}
	else
		if(ok_st)
			return s_st;
		else
			return s_dr;
}
int main()
{
    fin >> n >> m;
    for(i = 1; i <= n; i ++)
    {
    	fin >> x;
    	update(1, 1, n, i, x);
    }
    for(i = 1; i <= m; i ++)
    {
		fin >> a >> b;
		sol_global = query(1,1,n,a,b);
		fout << sol_global.Ssecv;
    }
    return 0;
}