Cod sursa(job #2861464)

Utilizator qweryclujRadu Alexandru qwerycluj Data 4 martie 2022 00:12:44
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>

// ne intereseaza minimul la un sir

using namespace std;
#define Nmax 100005

int sir[Nmax];
int rmq[Nmax][30];
int n, m;

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

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

void RMQ()
{
    for(int i = 1 ; i <= n; i++)
    {
        rmq[i][0] = i;
    }
    for(int i = 1; (1 << i) <= n; i++)
    {
        for(int poz = 1; poz + (1 << i) - 1 <= n; poz++)
        {
            // comparam doua jumatati
            if(sir[ rmq[poz][i-1] ] < sir[ rmq[poz+(1 << (i-1))][i-1] ])
            {
                rmq[poz][i] = rmq[poz][i-1];
            }
            else
            {
                rmq[poz][i] = rmq[poz+(1 << (i-1))][i-1];
            }
        }
    }
}

void query()
{
    int a, b;
    for(int i = 0; i < m; i++)
    {
        fin >> a >> b;
        int dist = log2(b - a + 1);
        fout << min(sir[rmq[a][dist]], sir[rmq[b - (1 << dist) + 1][dist]]) << endl;
    }
}

int main()
{
    citire();
    RMQ();
    query();
}