Cod sursa(job #2691216)

Utilizator AlexNeaguAlexandru AlexNeagu Data 27 decembrie 2020 16:02:08
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include<bits/stdc++.h>
#define int long long
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pi;
const int mod = 1e9 + 9;
const int N = 106 * 106;
const int nax = 1e6+6;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
ifstream in("rmq.in");
ofstream out("rmq.out");

int logaritm[100006];

int32_t main() {
 
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    // 
    logaritm[1] = 0;
    for(int i = 2; i < 100006; i++) {
        logaritm[i] = logaritm[i / 2] + 1;
    }


    int n, m;
    in >> n >> m;

    // n -> elemente
    // m -> queryuri

    int a[n + 1];
    for(int i = 1; i <= n; i++) in >> a[i];

    int mn[n + 1][30];

    // (1 << n) = 2 ^ n

    for(int i = 1; i <= n; i++) {
        mn[i][0] = a[i];
        // mn[i][0] --> i..i
    }

    // 2 ^ len --> lungimea intervalelor curente
    for(int len = 1; (1 << len) <= n; len++) {
        // acum precalculez raspunsurile pentru intervalele de lungime 2 ^ len
        // 2 ^ len elemente incepand cu i
        // i .. i + (2 ^ len) - 1

        for(int i = 1; i + (1 << len) - 1 <= n; i++) {
            mn[i][len] = min(mn[i][len - 1], mn[i + (1 << (len - 1))][len - 1]);
        }
    }


    for(int i = 1; i <= m; i++) {
        int l, r;
        in >> l >> r;
        int k = logaritm[r - l + 1];
        out << min(mn[l][k], mn[r - (1 << k) + 1][k]) << '\n';
        // sa impart intervalul l..r in doua intervale de lungime 2^k unde k un numar
        // k = log(r - l + 1) --> r-l+1 lungimea
        // 2^k lungimile intervalelor cu care voi imparti intervalul mare
        // min(mn[l][k], mn[r - 2^k + 1][k]) --> raspunsul la query

    }

    return 0;
}