Cod sursa(job #1932042)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 19 martie 2017 15:24:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>

using namespace std;

int n, m;
int mat[20][100005];

void citire()
{
	scanf("%d %d", &n, &m);

	for(int i = 0; i < n; i++)
	{
		scanf("%d", &mat[0][i]);
	}
}

void solve()
{
	int lg = (int)log2(n);	
	
	for(int i = 1; i <= lg; i++)
	{
		for(int j = 0; j < n; j++)
		{
			int poz = j + (1 << (i - 1));
			
			if(poz < n)
			{
				mat[i][j] = min(mat[i - 1][j], mat[i - 1][poz]);
			}
			else
			{
				mat[i][j] = mat[i - 1][j];
			}

		}
	}
}

int citireSolveTest()
{
	int st, dr;
	scanf("%d %d", &st, &dr);
	st--;
	dr--;
	int l = (dr - st) + 1;
	int lgl = (int)log2(l);

	return min(mat[lgl][st], mat[lgl][dr - (1 << lgl) + 1]);
}

int main()
{
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	
	citire();
	solve();

	for(int k = 0; k < m; k++)
	{
		printf("%d\n", citireSolveTest());
	}
}