Cod sursa(job #3128700)

Utilizator SorinBossuMarian Sorin SorinBossu Data 10 mai 2023 14:41:49
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
constexpr int nmax = 1000001;
int a[nmax], d[nmax];

void build(int v, int st, int dr)
{
    if ( st == dr )
    {
        d[v] = a[st];
        return;
    }
    int mij = (st + dr)/2;
    build(v*2, st, mij);
    build(v*2+1, mij+1, dr);
    d[v] = min(d[v*2], d[v*2+1]);
}

int query(int v, int st , int dr, int str, int drr)
{
    if ( str > drr )
        return 1000000;
    if ( str == st and drr == dr )
       return d[v];
    int mij = ( st + dr)/2;
    return min(query(v*2, st, mij, str, min(mij, drr)),
               query(v*2+1, mij+1, dr, max(str, mij+1), drr));
}
int main()
{
    int n, m;
    in >> n >> m;
    for ( int i = 1; i <= n; ++i )
        in >> a[i];
    build(1, 1, n);
    for ( int i = 1; i <= m; ++i )
    {
        int x, y;
        in >> x >> y;
        out << query(1, 1, n, x, y) << "\n";
    }
    return 0;
}