Cod sursa(job #402522)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 23 februarie 2010 22:09:18
Problema SequenceQuery Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<stdio.h>
#define inf -100001

int A[500000],B[500000],C[500000],Sum[500000],maxim,S,val,poz,start,stop;

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

void update(int nod,int st,int dr)
{
	int div;

	if(st==dr)
		A[nod]=B[nod]=C[nod]=Sum[nod]=val;
	div=(st+dr)/2;

	if(poz<=div)
		update(2*nod+1,st,div);
	else
		update(2*nod+2,div+1,dr);
	A[nod]=max(A[2*nod+1],Sum[2*nod+1]+A[2*nod+2]);//subsecventa de suma maxima la inceputul intervalului
	B[nod]=max(B[2*nod+2],Sum[2*nod+2]+B[2*nod+1]);//subsecventa de suma maxima la sfarsitul intervalului
	C[nod]=max(B[2*nod+1]+A[2*nod+2],max(C[2*nod+1],C[2*nod+2]));//subsecventa de suma maxima din interval
	Sum[nod]=Sum[2*nod+1]+Sum[2*nod+2];//suma numerelor din interval
}

void query(int nod,int st,int dr)
{
	int div;

	if(start<=st && dr<=stop)
	{
		maxim=max(maxim,max(C[nod],A[nod]+S));
		S=max(S+Sum[nod],B[nod]);
	}
	else
	{
		div=(st+dr)/2;
		if(start<=div)
			query(2*nod+1,st,div);
		if(stop>div)
			query(2*nod+2,div+1,dr);
	}
}

int main()
{
	int n,x,y,i,m;
	FILE *f=fopen("sequencequery.in","r");
	FILE *g=fopen("sequencequery.out","w");

	fscanf(f,"%i%i",&n,&m);
	for(i=0;i<n;i++)
	{
		fscanf(f,"%i",&val);
		poz=i;
		update(0,0,n-1);
	}
/*
	for(i=0;i<m;i++)
	{
		fscanf(f,"%i%i",&x,&y);
		x--;
		y--;
		start=x;
		stop=y;
		maxim=inf;
		S=0;
		query(0,0,n-1);
		fprintf(g,"%i\n",maxim);
	}*/
	fclose(f);
	fclose(g);
	return 0;
}