Cod sursa(job #541161)

Utilizator loginLogin Iustin Anca login Data 24 februarie 2011 21:10:58
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
# include <fstream>
# include <iostream>
# define DIM 200003
# define INF 2147000000
# define max(a,b) (a>b?a:b)
using namespace std;
struct arb{
	long long s, d, t, m;
};
long long sol, s;
arb a[4*DIM];

void upd (int k, int st, int dr, int p, int v)
{
	if (st==dr)
	{
		a[k].s=a[k].d=a[k].t=a[k].m=v;
		return;
	}
	int mij=(st+dr)/2;
	if (p<=mij)
		upd(2*k, st, mij, p, v);
	else 
		upd(2*k+1, mij+1, dr, p, v);
	a[k].t=a[2*k].t+a[2*k+1].t;
	a[k].s=max(a[2*k].t+a[2*k+1].s,a[2*k].s);
	a[k].d=max(a[2*k+1].t+a[2*k].d,a[2*k+1].d);
	a[k].m=max(max(a[2*k].m,a[2*k+1].m),a[2*k].d+a[2*k+1].s);
}

void query(int k, int st, int dr, int i, int j)
{
	if (st>=i && dr<=j)
	{
		sol=max(sol,max(s+a[k].s,a[k].m));
		s=max(s+a[k].t,a[k].d);
		return;
	}
	int mij=(st+dr)/2;
	if (i<=mij)query(2*k, st, mij, i, j);
	if (j>mij)query(2*k+1, mij+1, dr, i, j);
}

int main()
{
	ifstream fin ("sequencequery.in");
	freopen("sequencequery.out", "w", stdout);
	int x, y, q, n;
	fin>>n>>q;
	for(int i=1;i<=n;++i)
	{
		fin>>x;
		upd(1, 1, n, i, x);
	}
	for(int i=1;i<=q;++i)
	{
		fin>>x>>y;
		s=0, sol=-INF;
		query(1, 1, n, x, y);
		printf("%lld\n", sol);
	}
	return 0;
}