Cod sursa(job #2959620)

Utilizator Chris_BlackBlaga Cristian Chris_Black Data 1 ianuarie 2023 19:43:17
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.8 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int N = 100009,Lmax = 17;
int n,m,a,b,ST[N][Lmax],A[N];
void process()
{
    int i,j;
    for(int i=1;i<=n;++i)
        ST[i][0] = i;
    for(j=1;1<<j <= n;++j)
        for(int i=0;i + (1<<j) - 1<=n;++i)
            if(A[ST[i][j-1]] < A[ST[i+ ( 1 << (j-1) )][j-1]])
                ST[i][j] = ST[i][j-1];
            else
                ST[i][j] = ST[i+ ( 1 << (j-1) )][j-1];
}
int Query(int i,int j)
{
    int k = log2(j-i+1);
    return min(A[ST[i][k]] , A[ST[j-(1<<k)+1][k]]);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;++i)
        cin>>A[i];
    process();
    while(m--)
    {
        cin>>a>>b;
        cout<<Query(a,b)<<'\n';
    }
    return 0;
}