Cod sursa(job #600342)

Utilizator dspMihaiDespotovici Mihai dspMihai Data 1 iulie 2011 14:16:58
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <stdio.h>
#include <math.h>
#define MAX 100001
using namespace std;

long maxj,i,j,N,Mnr,sir[MAX],M[MAX][20];
int k,lg[MAX],pw2[20];

int minsir (int x, int y)
{
	if (sir[x]<sir[y]) return x;
	else return y;
}

int RMQ (long x, long y)
{
	k=lg[y-x+1];
	return sir[minsir(M[x][k],M[y-pw2[k]+1][k])];
}
int main ()
{
	FILE *f, *g;
	f=fopen("rmq.in", "r");
	g=fopen("rmq.out", "w");
	fscanf(f, "%d %d", &N, &Mnr);
	for (i=1; i<=N; i++) {fscanf(f, "%d", &sir[i]); M[i][0]=i;}
	lg[1]=0;
	for (i=2; i<=N; i++) lg[i]=lg[i/2]+1;
	pw2[0]=1;
	for (i=1; i<=19; i++) pw2[i]=pw2[i-1]*2;
	maxj=lg[N];
	for (j=1; j<=maxj; j++)
		for (i=1; i+pw2[j]-1<=N; i++)
			M[i][j]=minsir(M[i][j-1], M[i+pw2[j-1]][j-1]);
	for (; Mnr>=1; Mnr--)
	{
		fscanf(f, "%d %d", &i,&j);
		fprintf(g, "%d\n", RMQ(i,j));
	}	
	fclose(f); fclose(g);
	return 0;
}