Cod sursa(job #2566144)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 2 martie 2020 19:06:33
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>

#define MAXN    100005
#define LOG2    18

#define FILENAME    std::string("rmq")
std::ifstream input (FILENAME+".in");
std::ofstream output(FILENAME+".out");

int N, M;
int V[MAXN];
int logtable[MAXN];
int RMQ[LOG2][MAXN];

void computeRMQ() {
    for (int i=2; i<MAXN; ++i) logtable[i] = logtable[i>>1]+1;
    for (int i=1; i<=N; ++i) RMQ[0][i] = V[i];
    for (int i=1; i<LOG2; ++i)
        for (int j=1, k=(1<<i); k<=N; ++j, ++k)
            RMQ[i][j] = std::min(RMQ[i-1][j], RMQ[i-1][j+(1<<(i-1))]);
}
int query(int x, int y) {
    if (x > y) std::swap(x, y);
    int len = y-x+1;
    if (len == 1) return V[x];
    int logval = logtable[len]-1;
    return std::min(RMQ[logval][x], RMQ[logval][y-(1<<logval)+1]);
}

int main()
{
    input >> N >> M;
    for (int i=1; i<=N; ++i) input >> V[i];
    computeRMQ();
    for (int i=1, x, y; i<=M; ++i)
        input >> x >> y, output << query(x, y) << '\n';

    return 0;
}