Cod sursa(job #1476213)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 24 august 2015 17:42:15
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <cmath>
#include <bitset>
#include <utility>
#include <stack>
#define MAXN 50005

using namespace std;

int v[100005], segmTree[400005];

void build(int p, int L, int R);
int query(int p, int L, int R, int i, int j);
inline int left(int p) { return p << 1; };
inline int right(int p) { return (p << 1) + 1; };

int main() {
	int n, i, m, a, b;

	ifstream fin("rmq.in");
	ofstream fout("rmq.out");

	fin >> n >> m;
	for (i = 0; i < n; ++i)
		fin >> v[i];

	build(1, 0, n-1);

	for (i = 0; i < m; ++i) {
		fin >> a >> b;
		fout << v[query(1, 0, n - 1, a - 1, b - 1)] << '\n';
	}

	return 0;
}

void build(int p, int L, int R) {
	if (L == R)
		segmTree[p] = L;
	else {
		build(left(p), L , (L + R) / 2);
		build(right(p), (L + R) / 2 + 1, R);

		int p1 = segmTree[left(p)];
		int p2 = segmTree[right(p)];

		segmTree[p] = (v[p1] <= v[p2]) ? p1 : p2;
	}
}

int query(int p, int L, int R, int i, int j) {
	if (i > R || j < L)
		return -1;
	if (L >= i && R <= j)
		return segmTree[p];

	int p1 = query(left(p), L, (L + R) / 2, i, j);
	int p2 = query(right(p), (L + R) / 2 + 1, R, i, j);

	if (p1 == -1)
		return p2;
	if (p2 == -1)
		return p1;

	return (v[p1] <= v[p2]) ? p1 : p2;
}