Cod sursa(job #3256500)

Utilizator cris71Vlad Bogdan Cristian cris71 Data 14 noiembrie 2024 18:45:36
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
int const lmax=100007;
int rmq[27][lmax];///rmq[l][x] este min pentru intervalul [x,x+(1<<l)-1]
int n,m,lg2[lmax],v[lmax];
void precalc_rmq()
{
    for(int i=1;(1<<i)<n;i++)
    {
        for(int j=0;j+(1<<i)-1<n;j++)
        {
            rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
        }
    }
}
int querry(int st, int dr)
{
    int len=dr-st+1;
    int loglen=lg2[len];
    return min(rmq[loglen][st],rmq[loglen][dr-(1<<loglen)+1]);
}
int main()
{
    fin>>n>>m;
    for(int i=0;i<n;i++)
    {
        fin>>v[i];
        rmq[0][i]=v[i];
    }
    lg2[1]=0;
    for(int i=2;i<lmax;i++)
    {
        lg2[i]=lg2[i>>1]+1;
    }
    precalc_rmq();
    for(int i=0;i<m;i++)
    {
        int a, b;
        fin>>a>>b;
        a--;b--;
        fout<<querry(a,b)<<'\n';
    }
    return 0;
}