Cod sursa(job #3291406)

Utilizator dgrigaGriga Darius dgriga Data 4 aprilie 2025 17:13:23
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <iostream>
#include <climits>

using namespace std;

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

int a[105][100005];
int l;

int putm(int x)
{
    int p = 1, nr = 0;
    while (x >= p)
    {
        p = p * 2;
        nr++;
    }
    return nr - 1;
}

void bdkinda()
{
    for (int i = 0; i < 21; i++)
        for (int j = 0; j < 100005; j++)
            a[i][j] = INT_MAX;
}

void genMat(int n)
{
    int jc = 1;
    for (int i = 1; i < l; i++)
    {
        for (int j = 0; j < n; j++)
        {
            a[i][j] = min(a[i - 1][j], a[i - 1][j + jc]);
        }
        jc *= 2;
    }



}

int scrieM(int n)
{
    for (int i = 0; i < l; i++, cout << '\n')
    {
        for (int j = 0; j < n; j++)
        {
            cout << a[i][j] << ' ';
        }
    }
}

struct interval
{
    int start, finish;
};

int query(interval x)
{
    int pmin = putm(x.finish - x.start + 1);
    return min(a[pmin][x.start], a[pmin][x.finish - pmin]);
}

int main()
{

    int n, m;
    fin >> n >> m;
    l = putm(n);
    l++;
    bdkinda();
    for (int i = 0; i < n; i++)
    {
        fin >> a[0][i];
    }
    genMat(n);
    scrieM(n);

    for (int i = 0; i < m; i++)
    {
        interval x;
        fin >> x.start >> x.finish;
        x.start--;
        x.finish--;
        fout << query(x) << '\n';
    }
    return 0;
}