Cod sursa(job #171714)

Utilizator coderninuHasna Robert coderninu Data 4 aprilie 2008 21:43:13
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <stdio.h>
#include <values.h>
#define Nmax 100001

struct nod { int st, dr, all, sum; } tree[Nmax * 3 + 666];
int v[Nmax]; 
int N, M, x, i, j, rez, S, rst, rdr;


void buildTree(int st, int dr, int loc);
int query(int st, int dr);
inline int max(int x, int y) { return x > y ? x : y; }

int main()
{
	freopen("sequencequery.in", "r", stdin);
	freopen("sequencequery.out", "w", stdout);
	for (scanf("%d %d\n", &N, &M), i = 1; i<=N; i++)
		scanf("%d ", v+i);
	buildTree(1,N,1);
	for (; M; M--)
	{
		scanf("%d %d\n", &i, &j);
		rez = rst = rdr = -MAXINT+1000;
		S = 0;
		query(i,j);
		printf("%d\n", rez);
	}
	return 0;
}

void buildTree(int st, int dr, int loc)
{
	if (st == dr)
	{
		tree[loc].st = tree[loc].dr = tree[loc].all = tree[loc].sum = v[st];
		return;
	}
	int m = (st + dr) >> 1;
	buildTree(st,m,loc<<1);
	buildTree(m+1,dr,(loc<<1) + 1);
	tree[loc].sum = tree[loc << 1].sum + tree[(loc << 1) + 1].sum;
	tree[loc].st = max(tree[loc << 1].st, tree[loc << 1].sum + tree[(loc << 1) + 1].st);
	tree[loc].dr = max(tree[(loc << 1) + 1].dr, tree[(loc << 1) + 1].sum + tree[loc << 1].dr);
	tree[loc].all = max(tree[loc << 1].dr + tree[(loc << 1) + 1].st, max(tree[loc << 1].all, tree[(loc << 1) + 1].all));
}

int query(int st, int dr)
{
	if (st > dr) return 0;
	int ST = 1, DR = N, loc = 1, m;
	while (ST != st)
	{
		m = (ST + DR) >> 1;
		if (st <= m)
		{
			loc = loc << 1;
			DR = m;
		}
		else
		{
			loc = (loc << 1) + 1;
			ST = m+1;
		}
	}
	while (DR > dr)
	{
		DR = (ST + DR) >> 1;
		loc = loc << 1;
	}
	rst = max(rst,S+tree[loc].st);
	rdr = max(tree[loc].sum+rdr,tree[loc].dr);
	rez = max(rez, max(tree[loc].all,max(rst,max(tree[loc].dr,max(rdr,tree[loc].st)))));
	S +=tree[loc].sum;
	query(DR+1,dr);
	return 0;
}