Cod sursa(job #586877)

Utilizator eukristianCristian L. eukristian Data 3 mai 2011 09:32:10
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>

int M[100000][20];

int RMQ(int i, int j, int *A, int size);
int log2(int n);

int main()
{
	int N, qs, A[100000];
	
	FILE *f = fopen("rmq.in", "r");
	FILE *g = fopen("rmq.out", "w");
	
	fscanf(f, "%d %d\n", &N, &qs);
	
	for (int i = 0 ; i < N ; ++i)
	{
		fscanf(f, "%d", &A[i]);
		M[i][0] = i;
	}	
	
	for (int j = 1 ; (1 << j) <= N ; ++j)
	{
		for (int i = 0 ; i <= N - (1 << j) ; ++i)
		{
			if (A[M[i][j - 1]] <= A[M[i + (1 << (j - 1))][j - 1]])
				M[i][j] = M[i][j - 1];
			else
				M[i][j] = M[i + (1 << (j - 1))][j - 1]; 
		}
	}
	
	for (int i = 0 ; i < qs ; ++i)
	{
		int left, right;
		fscanf(f, "%d %d\n", &left, &right);
		fprintf(g, "%d\n", A[RMQ(left - 1, right - 1, A, N)]);
	}
	
	return 0;
}

int RMQ(int i, int j, int *A, int size)
{
	int k = log2(j - i + 1);
	if (A[M[i][k]] <= A[M[j - (1 << k) + 1][k]])
		return M[i][k];
	return M[j - (1 << k) + 1][k];
}

int log2(int n)
{
	int answer = 0;
	
	while ((n & (1 << 30 - answer)) == 0)
		answer++;
	
	return (30 - answer);
}