Cod sursa(job #3365621)

Utilizator DianaOfeliaDianaOfelia DianaOfelia Data 22 septembrie 2026 20:33:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <algorithm>
using namespace std;

const int MAXN = 100005;
const int LOG2n = 17; ///2^17 > 100000

int RMQ[LOG2n][MAXN];  ///RMQ[k][i]=minimul pe intervalul [i, i+2^k-1]
int V[MAXN];
int n,m;

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

int log2n(int n) ///calculeaza rapid log2(n)
{
    return 31- __builtin_clz(n);
}

void citesteDate()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>V[i];
}

void construiesteSparseTable()
{
    //baza=intervale de lungime 1
    for (int i=1;i<=n;i++)
        RMQ[0][i]=V[i];

    int maxK = log2n(n);
    for (int k=1;k<=maxK;k++)
    {
        int lungime=1<<k;
        for (int i=1;i+lungime-1<=n;i++)
            RMQ[k][i]=min(RMQ[k-1][i], RMQ[k-1][i+(1<<(k-1))]);
    }
}

int query(int x, int y)
{
    if (x>y)
        swap(x, y);
    int k=log2n(y-x+1);

    return min(RMQ[k][x], RMQ[k][y-(1<<k)+1]);
}

void raspundeIntrebari()
{
    int x, y;
    for (int i=1;i<=m; i++)
    {
        fin>>x>>y;
        fout<<query(x,y)<<'\n';
    }
}

int main()
{
    citesteDate();
    construiesteSparseTable();
    raspundeIntrebari();
    fin.close();
    fout.close();
    return 0;
}