Cod sursa(job #2900466)

Utilizator popescumateicalinPopescu Matei Calin popescumateicalin Data 10 mai 2022 21:35:04
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#pragma GCC optimize("O3,inline")

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

int n, m, x, y, i, rmq[270000];

void inserareRMQ(int stg, int dr, int pozRMQ)
{
    int mij = stg + (dr - stg) / 2;
    if (stg == dr)
    {
        rmq[pozRMQ] = x;
        return;
    }
    if (i <= mij)
    {
        inserareRMQ(stg, mij, 2 * pozRMQ + 1);
        rmq[pozRMQ] = std::min(rmq[2 * pozRMQ + 1], rmq[2 * pozRMQ + 2]);
    }
    if (i >= mij)
    {
        inserareRMQ(mij + 1, dr, 2 * pozRMQ + 2);
        rmq[pozRMQ] = std::min(rmq[2 * pozRMQ + 1], rmq[2 * pozRMQ + 2]);
    }
}

int minRMQ(int stg, int dr, int pozRMQ)
{
    if (x <= stg && y >= dr)
        return rmq[pozRMQ];
    if (x > dr || y < stg)
        return 100001;
    int mij = stg + (dr - stg) / 2;
    return std::min(minRMQ(stg, mij, 2 * pozRMQ + 1), minRMQ(mij + 1, dr, 2 * pozRMQ + 2));
}

int main()
{
    in >> n >> m;
    for (i = 0; i < n; i++)
    {
        in >> x;
        inserareRMQ(0, n - 1, 0);
    }
    for (i = 0; i < m; i++)
    {
        in >> x >> y;
        x--;
        y--;
        out << minRMQ(0, n - 1, 0) << '\n';
    }
    /*for (i = 0; i < 2 * n - 1; i++)
        out << rmq[i] << ' ';*/
    return 0;
}