Cod sursa(job #2100946)

Utilizator BaldurCronos Baldur Data 6 ianuarie 2018 16:59:34
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define N (int)1e5
#define SZ (int)log2(N)
#define DBG std::cout << "DEBUG\n"
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");

void preprocess(int a[][SZ], int b[], int n) {
        for (int i = 0; i < n; i++)
                a[i][0] = i;

        for (int j = 1; j <= log2(n); j++) {
                for (int i = 0; i + (1 << j) - 1 < n; i++) {
                        if (b[a[i][j - 1]] < b[a[i + (1 << j - 1)][j - 1]]) {
                                a[i][j] = a[i][j - 1];
                        } else {
                                a[i][j] = a[i + (1 << j - 1)][j - 1];
                        }
                }
        }
}

int query(int x, int y, int a[][SZ], int b[]) {
        int length = y - x + 1;
        int k = log2(length);
        return min(b[a[x][k]], b[a[x + length - (1 << k)][k]]);
}
int n, m, rmq[N][SZ], a[N];
int main() {
        in >> n >> m;
        for (int i = 0; i < n; i++)
                in >> a[i];

        preprocess(rmq, a, n);

        int qa, qb;
        for (int i = 1; i <= m; i++) {
                in >> qa >> qb;
                out << query(qa - 1, qb - 1, rmq, a) << "\n";
        }
        return 0;
}