Cod sursa(job #3291410)

Utilizator serban-paulSerban serban-paul Data 4 aprilie 2025 17:15:32
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <iostream>
#include <climits>

using namespace std;

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

int a[50][110000];
int l;

int putm(int x) {
    int p = 1, nr = 0;
    while (x >= p) {
        p = p * 2;
        nr++;
    }
    return nr - 1;
}

void bdkinda() {
    for (int i = 0; i < 21; i++)
        for (int j = 0; j < 100005; j++)
            a[i][j] = INT_MAX;
}

void genMat(int n) {
    int jc = 1;
    for (int i = 1; i < l; i++) {
        for (int j = 0; j < n; j++) {
            a[i][j] = min(a[i - 1][j], a[i - 1][j + jc]);
        }
        jc *= 2;
    }



}

int scrieM(int n) {
    for (int i = 0; i < l; i++, cout << '\n') {
        for (int j = 0; j < n; j++) {
            cout << a[i][j] << ' ';
        }
    }
}

struct interval{
    int start, finish;
};

int query(interval x) {
    int pmin = putm(x.finish - x.start + 1);
    return min(a[pmin][x.start], a[pmin][x.finish - pmin]);
}

int main()
{

    int n, m;
    fin >> n >> m;
    l = putm(n);
    l++;
    bdkinda();
    for (int i = 0; i < n; i++) {
        fin >> a[0][i];
    }
    genMat(n);
    scrieM(n);

    for (int i = 0; i < m; i++) {
        interval x;
        fin >> x.start >> x.finish;
        x.start--;
        x.finish--;
        fout << query(x) << '\n';
    }
    return 0;
}