Cod sursa(job #472085)

Utilizator robigiirimias robert robigi Data 22 iulie 2010 21:32:01
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 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[100001][32];
int lg[100001];

void read()
{
	fscanf(f, "%d%d", &n, &mm);
	for (int i=1; i<=n; i++)
	{
		fscanf(f, "%d", &v[i]);
		m[i][0]=i;
	}
	for (int j=1; (1<<j)<=n; ++j)
		for (int k=1; k+(1<<j)-1<=n; ++k)
		{
			if (v[m[k][j-1]]<v[m[k+(1<<(j-1))][j-1]])
			{
				m[k][j]=m[k][j-1];
			}
			else 
				m[k][j]=m[k+(1<<(j-1))][j-1];
		}
	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];
		int l=0;
		if (v[m[a][kk]]<v[m[b-(1<<kk)+1][kk]])
			fprintf(g, "%d\n", v[m[a][kk]]);
		else
			fprintf(g, "%d\n", v[m[b-(1<<kk)+1][kk]]);

	}
}



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