Cod sursa(job #165558)

Utilizator mihai0110Bivol Mihai mihai0110 Data 26 martie 2008 12:21:50
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
int i,j,n,m,x,y;
long long sol,s;
int v[10000];
long long a[10000],b[10000],c[10000],sum[10000];
long long maxim(long long a,long long b)
{
	if(a>b)
		return a;
	return b;
}
void build(int nod,int li,int ls)
{
	int mij=(li+ls)/2,st=nod*2,dr=st+1;
	if(li==ls)
	{
		a[i]=v[li];
		b[i]=v[li];
		c[i]=v[li];
		sum[i]=v[li];
	}
	else
	{
		build(st,li,mij);
		build(dr,mij+1,ls);

		a[nod]=maxim(a[st],sum[st]+a[dr]);
		b[nod]=maxim(b[dr],sum[dr]+b[st]);
		c[nod]=maxim(maxim(c[st],c[dr]),b[st]+a[dr]);
		sum[nod]=sum[st]+sum[dr];
	}
}
void query(int nod,int li,int ls)
{
	int mij=(li+ls)/2,st=nod*2,dr=st+1;
	if(x<=li&&y>=ls)
	{
		sol=maxim(maxim(a[nod],s+a[nod]),maxim(sol,c[nod]));
		s=maxim(b[nod],s+sum[nod]);
	}
	else
	{
	if(li<=mij)
		query(st,li,mij);
	if(ls>mij)
		query(dr,mij+1,ls);
	}
}
int main(void)
{
	freopen("sequencequery.in","r",stdin);
	freopen("sequencequery.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
	build(1,1,n);
	i=i;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		s=-32999;
		sol=-333444;
		query(1,1,n);
		printf("%lld",sol);
	}
	return 0;
}