Cod sursa(job #2617058)

Utilizator pascustefanPascu Stefan Liviu pascustefan Data 20 mai 2020 17:36:07
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#include <fstream>

using namespace std;

long int rmq[18][100002];
long int n,m;
long int lg[100002];
long int a[100002];

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

	long int i,j,l;
	scanf("%ld%ld", &n, &m);

    for (i = 1; i <= n; i++)
		scanf("%ld ", &a[i]);

	lg[1] = 0;
	for (i = 2; i <= n; i++)
		lg[i] = lg[i / 2] + 1;

	for (i = 1; i <= n; i++)
		rmq[0][i] = a[i];

    for (i = 1; (1 << i) <= n; i++)         //1 << i <=> 2 ^ i
		for (j = 1; j <= n - (1 << i) + 1; j++)
		{
            l = 1 << (i - 1);
            if(rmq[i - 1][j] < rmq[i - 1][j + l])
                rmq[i][j]= rmq[i - 1][j];
            else
                rmq[i][j]= rmq[i - 1][j + l];
		}

	long int x, y, diff, sh;

	for (i = 1; i <= m; i++)
	{
		scanf("%ld%ld", &x, &y);
		diff = y - x + 1;
		l = lg[diff];
        sh = diff - (1<<l);
		if(rmq[l][x] < rmq[l][x + sh])
            printf("%ld\n", rmq[l][x]);
		else
            printf("%ld\n", rmq[l][x + sh]);
	}
	return 0;
}