Cod sursa(job #2375882)

Utilizator AlexrotaruRotaru Alexandru Alexrotaru Data 8 martie 2019 12:48:08
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <cstring>
using namespace std;

#define INF 0x3f3f3f3f

int h[200100], n, m;

void update(int poz, int val, int k = 1, int st = 1, int dr = n)
{
    int mij = (st + dr) / 2;

    if(st == dr && dr == poz)
    {
        h[k] = val;
        return;
    }
    if(poz >= st && poz <= mij)
        update(poz, val, k * 2, st, mij);
    if(poz <= dr && poz > mij)
        update(poz, val, k * 2 + 1, mij + 1, dr);

    h[k] = min(h[k * 2], h[k * 2 + 1]);
}

int query(int a, int b, int st = 1, int dr = n, int k = 1)
{
    int mij = (st + dr) / 2, minval = INF;

    if(a <= st && b >= dr)
        return h[k];

    if(a <= mij)
        minval = min(minval, query(a, b, st, mij, k * 2));
    if(b > mij)
        minval = min(minval, query(a, b, mij + 1, dr, k * 2 + 1));

    return minval;
}

int main()
{
    ifstream in("rmq.in");
    ofstream out("rmq.out");
    int x, y;

    in >> n >> m;
    memset(h, 0x3f, sizeof(int) *(2 * n + 1));
    for(int i = 0; i < n; i++)
    {
        in >> x;
        update(i + 1, x);
    }
    for(int i = 0; i < m; i++)
    {
        in >> x >> y;
        out << query(x, y) << endl;
    }
    in.close();
    out.close();
}