Cod sursa(job #2494461)

Utilizator pimao2004Lupu Stefan Dragos pimao2004 Data 17 noiembrie 2019 21:23:08
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>

using namespace std;
ifstream in ("rmq.in");
ofstream out ("rmq.out");
const int nmax=100007;
int v[nmax],rmq[nmax][20];
int query(int a,int b)
{
    int pas;
    for(pas=0;(1<<pas)<b-a+1;pas++);
    pas--;
    if(v[rmq[a][pas]]<=v[rmq[b-(1<<pas)+1][pas]])
        return rmq[a][pas];
    else return rmq[b-(1<<pas)+1][pas];
}
int main()
{
    int n,m;
    in>>n>>m;
    int i;
    for(i=1;i<=n;i++)
    {
        in>>v[i];
        rmq[i][0]=i;
    }
    int j;
    for(j=1;(1<<j)<=n;j++)
    {
        for(i=1;i+(1<<j)-1<=n;i++)
        {
           if(v[rmq[i][j-1]]<v[rmq[i+(1<<(j-1))][j-1]])
                rmq[i][j]=rmq[i][j-1];
            else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
        }
    }
    int a,b;
    for(i=1;i<=m;i++)
    {
        in>>a>>b;
        out<<v[query(a,b)]<<'\n';
    }
    return 0;
}