Cod sursa(job #2571993)

Utilizator DariusDCDarius Capolna DariusDC Data 5 martie 2020 11:08:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax = 100005;
int n, q;
int a[nmax];
int sp[nmax][30];

inline void construct()
{
    for (int i = 1; i <= n; i++)
        sp[i][1] = a[i];
    for (int j = 2; (1 << (j-1)) <= n; j++)
        for (int i = 1; i + (1 << (j-1)) - 1<= n; i++)
            sp[i][j] = min(sp[i][j-1], sp[i + (1 << (j-2))][j-1]);
}

inline int querry(int a, int b)
{
    if (b < a)
        swap(a, b);
    int l = b-a+1;
    int k = log2(l) + 1;
    return min(sp[a][k], sp[b - (1 << (k-1)) + 1][k]);
}

int main()
{
    fin >> n >> q;
    for (int i = 1; i <= n; i++)
        fin >> a[i];
    construct();
    while (q--)
    {
        int a, b;
        fin >> a >> b;
        fout << querry(a, b) << "\n";
    }
    return 0;
}