Cod sursa(job #453912)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 11 mai 2010 15:44:50
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <stdio.h>
#include <vector.h>
#define DIM 100002
#define LOG 1<<5

FILE *f1 = fopen("rmq.in", "r");
FILE *f2 = fopen("rmq.out", "w");

int D[LOG][DIM], PWD[LOG], e[DIM], A[DIM];
int n, m;
int i, j, ii, x1, x2;

int main(){
	
	fscanf(f1, "%d %d", &n, &m);
	for (i=1; i<=n; i++)
		fscanf(f1, "%d", &A[i]);
	for (i=1; i<=n; i++)
		D[0][i] = A[i];
	for (i=2; i<=n; i++)
		e[i] = e[i/2] + 1;
	for (i=1, PWD[0]=1; PWD[i-1]<=n; i++)
		PWD[i] = PWD[i-1]<<1;
	
	for (i=1; i<=n; i*=2)
		for (j=1; j+PWD[i-1]<=n; j++)
			D[i][j] = min(D[i-1][j], D[i-1][j + PWD[i-1]]);
	
	for (ii=1; ii<=m; ii++){
		fscanf(f1, "%d %d", &x1, &x2);
		i = min(x1, x2), j = max(x1, x2);
		
		fprintf(f2, "%d\n", min( D[e[j-i+1]][i], D[e[j-i+1]][j-PWD[e[j-i+1]-1]]));
	}

	fclose(f1);
	fclose(f2);
	
	return 0;
}