Cod sursa(job #2876192)

Utilizator indianu_talpa_iuteTisca Catalin indianu_talpa_iute Data 23 martie 2022 09:38:08
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
#define MAXN 100000
#define LOGMAXN 18

using namespace std;

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

//csz programare dinamica
void sparse(int n, int arr[], int dp[][LOGMAXN]) {
    for (int i = 0; i < n; i++)
        dp[i][0] = i;
    for (int j = 1; (1 << j) <= n; j++)
        for (int i = 0; i + (1 << j) - 1 < n; i++)
            dp[i][j] = min(arr[dp[i][j - 1]], arr[dp[i + (1 << (j - 1))][j - 1]]);
}

void citire(int &n, int &m, int arr[], int dp[][LOGMAXN]) {
    fin >> n >> m;
    for (int i = 0; i < n; i++)
        fin >> arr[i];
    sparse(n, arr, dp);
}

int rezolvare(int &n, int arr[], int dp[][LOGMAXN]) {
    int i, j, k;
    fin >> i >> j;
    k = (int)log2(j - i + 1);
    if (arr[dp[i][k]] <= arr[dp[j - (1 << k) + 1][k]])
        return dp[i][k];
    return dp[j - (1 << k) + 1][k];
}

int main() {
    int n, m, arr[MAXN], dp[MAXN][LOGMAXN];
    citire(n, m, arr, dp);
    for (int i = 0; i < m; i++)
        fout << rezolvare(n, arr, dp) << '\n';
    return 0;
}