Cod sursa(job #2861460)

Utilizator qweryclujRadu Alexandru qwerycluj Data 3 martie 2022 23:53:05
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 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;
        if(a < b)
        {
            int dist = log2(b - a);
            fout << min(sir[rmq[a][dist]], sir[rmq[b - (1 << dist) + 1][dist]]) << endl;
        }
        else
        {
            int dist = log2(a - b);
            fout << min(sir[rmq[b][dist]], sir[rmq[a - (1 << dist) + 1][dist]]) << endl;
        }
    }
}

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