Cod sursa(job #586887)

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

int M[100000][20];
int A[100000];
char log2[100000];
//const int buffSize = 10000;

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

int main()
{
	int N, qs;
//	char buffer[buffSize];
	
	FILE *f = fopen("rmq.in", "r");
	FILE *g = fopen("rmq.out", "w");
	
	fscanf(f, "%d %d\n", &N, &qs);
	
	
	log2[1] = 0;
	for (int i = 2 ; i <= N ; ++i)
		log2[i] = log2[i / 2] + 1;
	/*
	int len = fread(buffer, sizeof(char), buffSize, f);
	int index = 0;*/
	for (int i = 0 ; i < N ; ++i)
	{/*
		bool neg = false;
		int nr = 0;
		
		if (buffer[index] == '-')
		{
			neg = true;index++;
		}
		
		while (buffer[index] >= '0' && buffer[index] <= '9' && index < len)
		{
			nr = nr * 10 + buffer[index++] - '0';
			if (index == len)
			{
				len = fread(buffer, sizeof(char), buffSize, f);
				index = 0;
			}
			if (len == 0)
				break;
		}
		index++;
		A[i] = nr;*/
		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;/*
		int nr = 0;
		
		if (index == len)
		{
			len = fread(buffer, sizeof(char), buffSize, f);
			index = 0;
		}
		while (buffer[index] >= '0' && buffer[index] <= '9' && index < len)
		{
			nr = nr * 10 + buffer[index++] - '0';
			if (index == len)
			{
				len = fread(buffer, sizeof(char), buffSize, f);
				index = 0;
			}
			if (len == 0)
				break;
		}
		
		index++;
		left = nr;
		nr = 0;
		if (index == len)
		{
			len = fread(buffer, sizeof(char), buffSize, f);
			index = 0;
		}
		
		while (buffer[index] >= '0' && buffer[index] <= '9' && index < len)
		{
			nr = nr * 10 + buffer[index++] - '0';
			if (index == len)
			{
				len = fread(buffer, sizeof(char), buffSize, f);
				index = 0;
			}
			if (len == 0)
				break;
		}
		index++;
		right = nr;*/
		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 << 20 - answer)) == 0)
		answer++;
	
	return (20 - answer);
}
*/