Cod sursa(job #472266)

Utilizator robigiirimias robert robigi Data 23 iulie 2010 16:46:52
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
// RangeMinimumQuery.cpp : Defines the entry point for the console application.
//


//#include "stdafx.h"
#include "stdio.h"
#include "math.h"

FILE *f=fopen("rmq.in", "r");
FILE *g=fopen("rmq.out", "w");

int n, mm, v[100001];
int m[18][100001];
int lg[100001];

void read()
{
	fscanf(f, "%d%d", &n, &mm);
	for (int i=1; i<=n; i++)
	{
		fscanf(f, "%d", &v[i]);
		m[0][i]=i;
	}
	for (int j=1; (1<<j)<=n; ++j)
		for (int k=1; k+(1<<j)-1<=n; ++k)
		{
			int l=k+(1<<(j-1));
			if (v[m[j-1][k]]<v[m[j-1][l]])
			{
				m[j][k]=m[j-1][k];
			}
			else 
				m[j][k]=m[j-1][l];
		}
	lg[0]=-1;
	for (int o=1; o<=n; o++)
		lg[o]=lg[o/2]+1;
}


void program()
{
	for (int o=1; o<=mm; ++o)
	{
		int a, b;
		fscanf(f, "%d%d", &a, &b);
		int kk=lg[b-a+1];
		if (v[m[kk][a]]<v[m[kk][b-(1<<kk)+1]])
			fprintf(g, "%d\n", v[m[kk][a]]);
		else
			fprintf(g, "%d\n", v[m[kk][b-(1<<kk)+1]]);

	}
}



int main()
{
	read();
	program();
	return 0;
}