Cod sursa(job #3273912)

Utilizator CiubarLoverBaiatu cu Ciubaru CiubarLover Data 4 februarie 2025 14:19:30
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>

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

int n, m, x, y;

int elem[100005];
int rmq[20][100005];

void createRmq() {

    for (int i = 1; i <= n; i++) {
        rmq[0][i] = elem[i];
    }
    for (int i = 1; i <= 17; i++) {
        if ((1 << i) > n) {
            break;
        }
        for (int j = 1; j <= n - (1 << i) + 1; j++) {
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j + (1 << (i - 1))]);
        }
    }
}

int findMinElem() {
    int dif = y-x+1;
    int pw = 17;
    int ans = INT_MAX;
    while (dif > 0) {
        if (dif >= (1 << pw)) {
            dif -= (1 << pw);
            ans = min(ans, rmq[pw][x]);
            x = x + (1 << pw);
        }
        pw--;
    }
    return ans;
}

int main() {
    fin >> n >> m;

    for (int i = 1; i <= n; i++) {
        fin >> elem[i];
    }

    createRmq();

    for (int i = 1; i <= m; i++) {
        fin >> x >> y;
        fout << findMinElem() << "\n";
    }
    return 0;
}