Cod sursa(job #2705988)

Utilizator DragosC1Dragos DragosC1 Data 13 februarie 2021 16:43:48
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
using namespace std;

ifstream f;
ofstream g;
int n, q;
int ai[100001 * 2 + 1];
int a[100001];
const int Inf = 1e5 + 1;

void read() {
    int i;
    f.open("rmq.in");
    f >> n >> q;
    for (i = 1; i <= n; i++)
        f >> a[i];
}

void buildTree(int ind, int st, int dr) {
    if (st == dr) {
        ai[ind] = a[st];
        return;
    }

    int mij = (st + dr) / 2;

    buildTree(ind * 2, st, mij);
    buildTree(ind * 2 + 1, mij + 1, dr);

    ai[ind] = min(ai[ind * 2], ai[ind * 2 + 1]);
}

int querry(int ind, int st, int dr, int qst, int qdr) {
    if (st > qdr || dr < qst)
        return Inf;
    if (st >= qst && dr <= qdr)
        return ai[ind];
    
    int mij = (st + dr) / 2;
    int l = querry(ind * 2, st, mij, qst, qdr);
    int d = querry(ind * 2 + 1, mij + 1, dr, qst, qdr);
    return min(l, d);
}

void solve() {
    int i, x, y;
    g.open("rmq.out");
    for (i = 1; i <= q; i++) {
        f >> x >> y;
        g << querry(1, 1, n, x, y) << '\n';
    }
    f.close();
    g.close();
}

int main() {
    read();
    buildTree(1, 1, n);
    solve();
    return 0;
}