Cod sursa(job #13356)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 6 februarie 2007 13:12:34
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#include<math.h>
#define fin "sequencequery.in"
#define fout "sequencequery.out"
#define Nmax 1000001
#define Inf 1000000L*100000L
int n,m,a,b;
long long segm[Nmax][3],best,min,val1,val2,val3;
FILE *in,*out;

inline long long maxf(long long a,long long b) { (a<b)?(a=b):(a); return a; }
inline long long minf(long long a,long long b) { (a>b)?(a=b):(a); return a; }

void insert(int nod,int st,int dr) {
int m;
	if (st==a && dr==a) {
		segm[nod][0]=(long long)val3;
		segm[nod][1]=(long long)val2;
		segm[nod][2]=(long long)val1;
	}

	else {
		m=(st+dr)/2;
		
		if (a<=m) 
			insert(2*nod,st,m);
		else	
			insert(2*nod+1,m+1,dr);
		
		segm[nod][0]=minf(segm[2*nod][0],segm[2*nod+1][0]);
		segm[nod][1]=maxf(segm[2*nod][1],segm[2*nod+1][1]);
		segm[nod][2]=maxf(segm[2*nod][2],segm[2*nod+1][2]);
		segm[nod][2]=maxf(segm[2*nod+1][1]-segm[2*nod][0],segm[nod][2]);

	}

}

void query(int nod,int st,int dr) {
int m;
	if (a<=st && dr<=b) {
		best=maxf(best,segm[nod][2]);
		best=maxf(best,segm[nod][1]-min);
	       	min=minf(min,segm[nod][0]);
	}

	else {
		m=(st+dr)/2;
		if (a<=m) 
			query(2*nod,st,m);
		if (b>m) 
			query(2*nod+1,m+1,dr);	
	}
}

int main() {
int i,tmp;
long long sum;
	
	in=fopen(fin,"r"); out=fopen(fout,"w");

	fscanf(in,"%i%i",&n,&m);
	
	sum=0;

	for (i=1;i<Nmax;++i) segm[i][0]=segm[i][1]=segm[i][2]=-(long long)Inf;

	for (i=1;i<=n;i++) { 
		
		fscanf(in,"%i",&tmp);
		
		val3=(long long)sum;
		sum=(long long)(sum+tmp); 
		val1=(long long)tmp; val2=(long long)sum; val3=minf(val3,sum);
		a=i;
		insert(1,1,n);	

	}
	
	for (i=1;i<=m;++i) {
		fscanf(in,"%i%i",&a,&b);
		
		best=-(long long)Inf; min=(long long)Inf;
		
		query(1,1,n);

		fprintf(out,"%lld\n",best);
	}

	fclose(in); fclose(out);

	return 0;
}