Cod sursa(job #2068738)

Utilizator anisca22Ana Baltaretu anisca22 Data 18 noiembrie 2017 10:46:23
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <bits/stdc++.h>
#define NMAX 100005

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int N, M;
int l[NMAX], a[NMAX];
int rmq[20][NMAX];

int main()
{
    fin >> N >> M;
    for (int i = 1; i <= N; i++) /// citire sir
        fin >> a[i];
    for (int i = 2; i <= N; i++) /// logaritmul din numar
        l[i] = l[(i >> 2)] + 1;
    for (int i = 1; i <= N; i++) /// initializare
        rmq[0][i] = a[i];
    ///build
    for (int i = 1; i <= l[N]; i++)
    {
        int put = (1 << i);
        for (int j = 1; j + put - 1 <= N; j++)
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + put / 2]);
    }
    ///query
    for (int i = 1; i <= M; i++)
    {
        int x, y;
        fin >> x >> y;
        int lg = l[y - x + 1];
        int put = (1 << lg);
        fout << min(rmq[lg][x], rmq[lg][y - put + 1]) << "\n";
    }
    return 0;
}