Cod sursa(job #2110049)

Utilizator BourucLiviuBouruc Petru Liviu BourucLiviu Data 20 ianuarie 2018 12:13:07
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <fstream>

#define N 100005

using namespace std;

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

int rmq[17][N], P[N], n;

void Puteri()
{
    P[1] = 0;
    for(int i = 2; i <= n; ++i)
        P[i] = 1 + P[i/2];
}

void RMQ()
{
    int L = P[n];
    for(int i = 1; i <= L; ++i)
        for(int j = 1; j <= n - (1<<i) + 1; ++j)
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);
}

int main()
{
    int Q;
    fin >> n >> Q;
    for(int i = 1; i <= n; ++i)
        fin >> rmq[0][i];
    Puteri();
    RMQ();

    int x, y, len;
    while(Q--)
    {
        fin >> x >> y;
        len = P[y-x+1];
        fout << min(rmq[len][x], rmq[len][y-(1<<len)+1]) << '\n';
    }
    fin.close(); fout.close();
    return 0;
}