Cod sursa(job #2494)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 17 decembrie 2006 12:28:50
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
#define fin "sequencequery.in"
#define fout "sequencequery.out"
#define NMAX 100001
#define SMAX 1000001
long n,m,min,val,a,b,v[NMAX],segm[SMAX];
FILE *in,*out;

void insert(long nod,long st,long dr) {
long m;
	if (st==a && dr==a) segm[nod]=val;
	
	else {
		m=(st+dr)/2;

		if (a<=m) insert(2*nod,st,m);

		else insert(2*nod+1,m+1,dr);

		if (segm[2*nod]<segm[2*nod+1]) segm[nod]=segm[2*nod];

		else segm[nod]=segm[2*nod+1];

	}
}

void query(long nod,long st,long dr) {
long m;
	if (a<=st && dr<=b) {

		if (min>segm[nod]) min=segm[nod];
	}

	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() {
long i,j,tmp;
	in=fopen(fin,"r"); out=fopen(fout,"w");

	fscanf(in,"%ld%ld",&n,&m);
		
	for (i=1;i<SMAX;i++) segm[i]=NMAX;

	for (i=1;i<=n;i++) { 
		
		fscanf(in,"%ld",&v[i]);

		v[i]+=v[i-1];
		
		val=v[i]; a=i; 

		insert(1,1,n);

	}
	
	for (i=1;i<=m;i++) {

		fscanf(in,"%ld%ld",&a,&b);
		
		b--; //am grija sa evit cazul in care min este v[b] 
		
		min=NMAX;

		query(1,1,n);
		
		tmp=v[b]-min;

		fprintf(out,"%ld\n",tmp);
	}
	
	fclose(in); fclose(out);

	return 0;
}