Cod sursa(job #383923)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 18 ianuarie 2010 19:24:10
Problema SequenceQuery Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<stdio.h>
#define infile "sequencequery.in"
#define outfile "sequencequery.out"
#define nmax (400*1001)
#define inf ~(1<<31)
struct arb
{
	int min; //valoarea minima din interval
	int max; //valoarea maxima din interval
	int best; //subsecventa de suma maxima
}a[nmax];
int v[nmax]; //vectorul cu elementele
int n; //numarul de elemente din arbore
int m; //numarul de query-uri
int qmin; //valoarea minima la fiecare query

inline int min(int a, int b)
{
	if(a<b) return a; return b;
}

inline int max(int a, int b)
{
	if(a>b) return a; return b;
}

void read()
{
	int i;
	scanf("%d %d\n",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
}

void init()
{
	int i;
	
	for(i=1;i<=n;i++)
		v[i]+=v[i-1];
}

void construct_arb(int rad, int st, int dr)
{
	a[rad].best=a[rad].max=-inf; a[rad].min=inf;
	if(st==dr)
	{
		a[rad].best=v[st]-v[st-1];
		a[rad].min=a[rad].max=v[st];
		return;
	}
	int mij=(st+dr)>>1;
	if(st<=mij) construct_arb(rad<<1,st,mij);
	if(mij<dr) construct_arb((rad<<1)|1,mij+1,dr);
	a[rad].min=min(a[rad<<1].min,a[(rad<<1)|1].min);
	a[rad].max=max(a[rad<<1].max,a[(rad<<1)|1].max);
	a[rad].best=max(a[(rad<<1)|1].max-a[rad<<1].min,max(a[rad<<1].best,a[(rad<<1)|1].best));
}

int query(int rad, int st, int dr, int p, int q)
{
	if(p<=st && dr<=q)
	{
		int r=a[rad].best;
		if(qmin!=inf) r=max(r,a[rad].max-qmin);
		qmin=min(qmin,a[rad].min);
		return r;
	}
	int mij=(st+dr)>>1;
	if(p<=mij && mij<q)
	{
		int r=query(rad<<1,st,mij,p,q);
		r=max(r,query((rad<<1)|1,mij+1,dr,p,q));
		return r;
	}
	else if(p<=mij) return query(rad<<1,st,mij,p,q);
	else return query((rad<<1)|1,mij+1,dr,p,q);
}

void solve()
{
	int st,dr;
	while(m--)
	{
		qmin=inf;
		scanf("%d %d\n",&st,&dr);
		printf("%d\n",query(1,1,n,st,dr));
	}
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	init();
	construct_arb(1,1,n);
	solve();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}