Cod sursa(job #3124219)

Utilizator zzzzzZazaazaza zzzzz Data 27 aprilie 2023 11:40:36
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <iostream>
#include <cmath>

int n, m, v[100005], lung[100005], rmq[100005][20], x, y;

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

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

    for(int i = 2; i <= n; ++i) lung[i] = lung[i >> 1] + 1;
    for(int i = 1; i <= n; ++i) rmq[0][i] = v[i];

    for(int i = 1; (1 << i) <= n; i++) {
        for(int j = 1, l; j <= n - (1 << i) + 1; j++)
		{
            l = 1 << (i - 1);
            rmq[i][j] = std::min(rmq[i-1][j], rmq[i-1][j+l]);
		}
    }

    for(int i = 1, d, l; i <= m; i++)
	{
		scanf("%d %d", &x, &y);

		d = y - x + 1;
		l = lung[d];
		printf("%d\n", std::min(rmq[l][x], rmq[l][x + d - (1 << l)]));
	}

    fclose(stdin);
    fclose(stdout);
    return 0;
}