Cod sursa(job #2646418)

Utilizator ArthurelVilceanu Razvan-Arthur Arthurel Data 1 septembrie 2020 10:03:17
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100001;

#define min(a, b) ((a) < (b) ? (a) : (b))

int v[NMAX], tree[2 * NMAX];

void buildArbInt(int node, int st, int dr)
{
    if (st == dr)
    {
        tree[node] = v[st];
    }
    else
    {
        int mid = (st + dr) / 2;
        buildArbInt(2 * node, st, mid);
        buildArbInt(2 * node + 1, mid + 1, dr);

        tree[node] = min(tree[2 * node], tree[2 * node + 1]);
    }
}

int RMQ(int node, int st, int dr, int qst, int qdr)
{
    if (qst <= st && dr <= qdr) return tree[node];

    int mid = (st + dr) / 2;
    if (qdr <= mid)
    {
        return RMQ(2 * node, st, mid, qst, qdr);
    }
    else if (qst > mid)
    {
        return RMQ(2 * node + 1, mid + 1, dr, qst, qdr);
    }
    else
    {
        int RMQst = RMQ(2 * node, st, mid, qst, qdr);
        int RMQdr = RMQ(2 * node + 1, mid + 1, dr, qst, qdr);
        return min(RMQst, RMQdr);
    }
}

int main()
{
    int n, m;
    in >> n >> m;
    for (int i = 0; i < n; i++)
    {
        in >> v[i];
    }
    buildArbInt(1, 0, n-1);

    for (int i = 0; i < m; i++)
    {
        int qst, qdr;
        in >> qst >> qdr;
        out << RMQ(1, 0, n - 1, qst - 1, qdr - 1) << '\n';
    }
    return 0;
}