Cod sursa(job #2875872)

Utilizator SabailaCalinSabaila Calin SabailaCalin Data 22 martie 2022 15:08:39
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int INF = __INT_MAX__;

vector <int> tree;

void PowOf2(int &n)
{
    int pow = 1;
    while (pow < n)
    {
        pow = pow << 1;
    }
    n = pow;
}

int Query(int currentNode, int treeLeft,  int treeRight,
                           int queryLeft, int queryRight)
{
    if (queryLeft <= treeLeft && treeRight <= queryRight)  return tree[currentNode];
    if (treeRight < queryLeft || queryRight < treeLeft)    return INF;

    int middle = (treeLeft + treeRight) / 2;
    return min(Query(2 * currentNode, treeLeft, middle, queryLeft, queryRight),
               Query(2 * currentNode + 1, middle + 1, treeRight, queryLeft, queryRight));
}

int main()
{
    int n, q;
    f >> n >> q;
    int temp = n;

    PowOf2(n);
    tree.resize(2 * n);
    for (int i = 0; i < temp; i++)
    {
        f >> tree[n + i];
    }
    for (unsigned int i = temp + n; i < tree.size(); i++)
    {
        tree[i] = INF;
    }
    for (int i = n - 1; i >= 1; i--)
    {
        tree[i] = min(tree[2*i], tree[2*i + 1]);
    }

    for (int i = 1; i <= q; i++)
    {
        int left, right;
        f >> left >> right;
        g << Query(1, 1, n, left, right) << "\n";
    }
}