Cod sursa(job #2286140)

Utilizator richard26Francu Richard richard26 Data 19 noiembrie 2018 21:00:29
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <bits/stdc++.h>
#define N_MAX 100001

using namespace std;

long int m[N_MAX][18], arr[100001];

long int pmini(int x, int y)
{
	return ( (arr[x] < arr[y]) ? x:y);
}
void rmq(long int n)
{
	
	for (long int i = 0; 1 << i <= n; i++)
		for (long int j = 0; j + (1 << i) - 1 < n; j++)
		{
			if (i == 0) m[j][i] = j;
				else{
					long int x = m[j][i - 1];
					long int y = m[j + (1 << (i - 1))][i - 1];
					m[j][i] = pmini(x, y);
				}
		}
}

long int quuery(long int l, long int r)
{
	long int diff = r - l + 1;
	long int k = log(diff);
	long int x = m[l][k];
	long int y = m[l + diff - (1 << k)][k];
	long int mini = pmini(x, y);
	return arr[mini];
	

}
int main()
{
	ifstream f("rmq.in");
	ofstream g("rmq.out");
	long int n, k;
	f>>n>>k;
	for (long int i = 0; i < n; i++)
		f>>arr[i];
	rmq (n);
	
	for (long int i = 0; i < k; i++){
		long int x, y;
		f>>x>>y;
		g<<quuery(x - 1, y - 1)<<"\n";

	}
	return 0;

}