Cod sursa(job #2771330)

Utilizator AlexZeuVasile Alexandru AlexZeu Data 26 august 2021 16:31:54
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
using namespace std;

const int mxN = 1e5 + 5, LOG = 17;

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

int N, M, nums[mxN], dp[mxN][LOG], Log[mxN]; //dp[i][j] -> cel mai mic numar de la i la 2^j

void query(int left, int right) {
    //trebuie sa gasesc puterea cea mai mare pana la lungimea x - yh
    int length = right - left + 1;
    int putere = Log[length];
    fout << min(dp[left][putere], dp[right - (1 << putere) + 1][putere]) << '\n';
}

int main() {
    ios::sync_with_stdio(false), fin.tie(nullptr), fout.tie(0);
    fin >> N >> M;
    for (int i = 2; i <= N; ++i) {
        Log[i] = Log[i / 2] + 1; 
    }
    for (int i = 0; i < N; ++i) {
        fin >> nums[i];
        dp[i][0] = nums[i];
    }
    for (int k = 1; k < LOG; k++) {
        for (int i = 0; i + (1 << k) - 1 < N; ++i) {
            dp[i][k] = min(dp[i][k - 1], dp[i + (1 << (k - 1))][k - 1]);
        }
    }
    while (M--) {
        int x, y; fin >> x >> y; --x, --y;
        query(x, y);
    }
    return 0;
}