Cod sursa(job #2112072)

Utilizator stefanst77Luca Stefan Ioan stefanst77 Data 22 ianuarie 2018 22:43:40
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
#define nmax 100007

using namespace std;

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

int n, m;
int rmq[20][nmax];
/**
  rmq[i][j] = valoarea minima a intervalului
     de lungime 2^i care se termina la pozitia j
**/
int p[nmax];
/// p[i] = k - exponentul maxim cu proprietatea
///     ca 2^k este mai mic sau egal cu i

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

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

int main()
{
    int x, y, i, j, putere;
    fin >> n >> m;
    for (i = 1; i <= n; i++)
        fin >> rmq[0][i];
    /// minimul pe intervale de lungime 1

    Putere();
    RMQ();

    for (j = 1; j <= m; j++)
    {
        fin >> x >> y;
        putere = p[y - x + 1];
        fout << min(rmq[putere][x], rmq[putere][y - (1 << putere) + 1]) << "\n";
    }
    fin.close();
    fout.close();
    return 0;
    }