Cod sursa(job #2300484)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 11 decembrie 2018 15:55:15
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
using namespace std;

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

const int MAXN = 100000 + 16;
const int MAXLOGN = 24;
int N, M;
int RMQ[MAXN][MAXLOGN];
int A[MAXN], LOG[MAXN];

int main()
{
    fin >> N >> M;
    for(int i = 1; i <= N; ++i)
    {
        fin >> A[i];
        RMQ[i][0] = i;
    }

    LOG[1] = 0;
    for(int i = 2; i <= N; ++i)
        LOG[i] = LOG[i >> 1] + 1;

    for(int j = 1; (1 << j) <= N; ++j)
        for(int i = 1; i + (1 << j) - 1 <= N; ++i)
    {
        if(A[RMQ[i][j - 1]] < A[RMQ[i + (1 << (j - 1))][j - 1]])
            RMQ[i][j] = RMQ[i][j - 1];
        else
            RMQ[i][j] = RMQ[i + (1 << (j - 1))][j - 1];
    }

    while(M--)
    {
        int x, y;
        fin >> x >> y;

        int len = LOG[y - x + 1];
        fout << min(A[RMQ[x][len]], A[RMQ[y - (1 << len) + 1][len]]) << '\n';
    }

    return 0;
}