Cod sursa(job #453607)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 11 mai 2010 09:19:32
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 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], exp[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];
		exp[i] = exp[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[exp[j-i+1]][i], D[exp[j-i+1]][j-PWD[exp[j-i+1]]+1]));
	}

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