Cod sursa(job #2399793)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 8 aprilie 2019 00:07:19
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <iostream>
#define MAX 100001
#define MAX_POWER 20

using namespace std;

int v[MAX], dp[MAX][MAX_POWER];

int log(int n)
{
    int copie, contor = 0;

    copie = 1;

    while(copie < n)
    {
        copie *= 2;
        contor++;
    }

    return contor;
}
int main()
{
    int n, m, i, j, in, sf, logaritm;

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

    fin >> n >> m;

    for(i = 1; i <= n; i++)
    {
        fin >> v[i];

        dp[i][0] = i;
    }

    for(j = 1; 1 << j <= n; j++)
    {
        //cout << j << ": ";
        for(i = 1; i + (1 << j) - 1 <= n; i++)
        {
            if(v[dp[i][j - 1]] < v[dp[i + (1 << (j - 1))][j - 1]])dp[i][j] = dp[i][j - 1];
            else dp[i][j] = dp[i + (1 << (j - 1))][j - 1];

            //cout << dp[i][j] << " ";
        }

       // cout << endl;
    }

    for(i = 1; i <= m; i++)
    {
        fin >> in >> sf;

        logaritm = log(sf - in + 1) - 1;
        //cout << logaritm << endl;

        fout << min(v[dp[in][logaritm]], v[dp[sf - (1 << logaritm) + 1][logaritm]]) << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}