Cod sursa(job #2286802)

Utilizator richard26Francu Richard richard26 Data 20 noiembrie 2018 20:04:09
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <bits/stdc++.h>
#define N_max 100010

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int m[N_max][18], arr[N_max];

int pmini(int x, int y)
{
	return ((arr[x] < arr[y]) ? x:y);
}

void rmq(int n)
{
	for(int i = 0; i < n; i++) m[i][0] = i;

	for (int i = 1; (1 << i) < n; i++){
		for (int j = 0; j - 1 + (1 << i) < n; j++){
			int p1 = m[j][i - 1];
			int p2 = m[j + (1 << (i - 1))][i - 1];
			m[j][i] = pmini(p1, p2);
		}
	}
}

int query(int l, int r)
{
	int diff = r - l + 1;
	int k = log(diff);
	int p1 = m[l][k];
	int p2 = m[l + diff - (1<<k)][k];
	return arr[pmini(p1, p2)];
}


int main()
{
	int n ,q;
	f>>n>>q;
	for (int i = 0; i < n; i++) f>>arr[i];
	rmq(n);
	
	for(int i = 1; i <= q; i++){
		int p1, p2;
		f>>p1>>p2;
		g<<query(p1 - 1, p2 - 1)<<"\n";

	}
	

	return 0;
}