Cod sursa(job #3003377)

Utilizator 100pCiornei Stefan 100p Data 15 martie 2023 18:10:36
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>

#define MAX 100000
#define FILES freopen("rmq.in","r",stdin);\
              freopen("rmq.out","w",stdout);
#define mod 666013

using namespace std;

int n, m, v[MAX + 5], rmq[MAX + 5][18];

int a, b;

int getMin(int a, int b)
{
    int d = b - a + 1, p = 1, e = 0;
    while(p * 2 < d)
        p *= 2, e++;
    int mn = min(a, b), mx = max(a, b);
    return min(rmq[mn][e], rmq[mx - p + 1][e]);
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    FILES
    std::cin >> n >> m;
    for(int i = 1;i <= n; ++i)
        std::cin >> v[i], rmq[i][0] = v[i];
    int p = log2(n), sz = n;
    for(int i = 1;i <= p; ++i)
    {
        sz -= (1 << (i - 1));
        for(int j = 1;j <= sz; ++j)
            rmq[j][i] = min(rmq[j][i - 1], rmq[j + (1 << (i - 1))][i - 1]);
    }
    for(int i = 1;i <= m; ++i)
    {
         std::cin >> a >> b;
         std::cout << getMin(a, b) << '\n';
    }
}