Cod sursa(job #1493344)

Utilizator tain1234andrei laur tain1234 Data 29 septembrie 2015 04:27:41
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <string>
using namespace std;
int a[100010];
int m, c, N, index;
int M[31][1000010];
void rmq(){
	for (int i = 0; i < N; ++i)
		M[0][i] = i;
	for (int j = 1; (1 << j) <= N; ++j)
	for (int i = 0; i + (1 << j) - 1 < N; ++i)
	if (a[M[j - 1][i]] < a[M[j - 1][i + (1 << (j - 1))]])
		M[j][i] = M[j-1][i];
	else M[j][i] = M[j - 1][i + (1 << (j - 1))];
}
int main(){
	ifstream f("rmq.in");
	ofstream of("rmq.out");
	string s;
	getline(f, s);
	int nr, j;
	nr = 0;
	j = 0;
	while (s[j] != ' '){
		nr = nr * 10 + s[j] - '0';
		++j;
	}
	N = nr;
	++j;
	nr = 0;
	while (j < s.size()){
		nr = nr * 10 + s[j] - '0';
		++j;
	}
	m = nr;
	int k, pow;
	for (int i = 0; i < N; ++i){
		j = 0; nr = 0;
		getline(f, s);
		while (j<s.size()){
			nr = nr * 10 + s[j] - '0';
			++j;
		}
		a[i] = nr;
	}
	rmq();
	for (int i = 0; i < m; ++i){
		k = 0; pow = 1;
		j = 0; nr = 0;
		getline(f, s);
		while (s[j] != ' '){
			nr = nr * 10 + s[j] - '0';
			++j;
		}
		c = nr;
		++j;
		nr = 0;
		while (j<s.size()){
			nr = nr * 10 + s[j] - '0';
			++j;
		}
		N = nr;
		--c;
		--N;
		if (N < c){
			N ^= c;
			c ^= N;
			N ^= c;
		}
		while (pow <= N - c + 1){ pow <<= 1; ++k; }
		--k;
		pow >>= 1;
		index = (a[M[k][c]] <= a[M[k][N - pow + 1]]) ? M[k][c] : M[k][N - pow + 1];
		of << a[index] << "\n";
	}
	return 0;
}