Cod sursa(job #2970171)

Utilizator matei8787Matei Dobrea matei8787 Data 24 ianuarie 2023 13:48:25
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int n, m;
int rmq[20][100005];
void citire()
{
    in>>n>>m;
    for ( int i = 1 ; i <= n ; i++ )
    {
        in>>rmq[0][i];
    }
}
void make_rmq()
{
    for ( int i = 1 ; (1<<i) <= n ; i++ )
    {
        for ( int j = 1 ; j + (1<<i) - 1 <= n ; j++ )
        {
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);
        }
    }
}
int getLog(int x)
{
    int ans = 0;
    while ( (1<<ans) <= x )
        ans++;
    ans--;
    return ans;
}
void rez()
{
    make_rmq();
    for ( int i = 1 ; i <= m ; i++ )
    {
        int x, y;
        in>>x>>y;
        int k = getLog(y-x);
        out<<min(rmq[k][x], rmq[k][y-(1<<k)+1])<<'\n';
    }
}
int main()
{
    citire();
    rez();
    return 0;
}