Cod sursa(job #3291395)

Utilizator dgrigaGriga Darius dgriga Data 4 aprilie 2025 16:57:17
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int a[25][100005];
int l, jc=1;
int putm(int x)
{
    int p=1, nr=0;
    while(x>=p)
        p=p*2, nr++;
    return nr;
}
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)
{
    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++)
    {
        for(int j=0; j<n; j++)
            cout << a[i][j] << " ";
        cout << '\n';
    }
}
struct interval
{
    int start, finish;
};
int query(interval x)
{
    int pmin=putm(x.finish-x.start+1)-1;
    return min(a[pmin][x.start], a[pmin][x.finish-pmin]);
}
int main()
{
    int n, m;
    f >> n >> m;
    l=putm(n);
    bdkinda();
    for(int i=0; i<n; i++)
        f >> a[0][i];
    genMat(n);
    scrieM(n);
    for(int i=0; i<m; i++)
    {
        interval x;
        f >> x.start >> x.finish;
        x.start--;
        x.finish--;
        g << query(x) << "\n";
    }
    return 0;
}