Cod sursa(job #2903793)

Utilizator NicuDirvaDirva Nicolae NicuDirva Data 17 mai 2022 20:33:10
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int bmp[100001][20], v[100000], log2[100000], n;

void rmq(int n)
{
    for (int i = 0; i < n; i++)
      bmp[i][0] = i;

    for (int j=1;1<<j<= n;j++)
      for (int i=0;i+(1<<j)-1<n;i++)
        if(v[bmp[i][j-1]]<v[bmp[i+(1<<(j-1))][j-1]])
            bmp[i][j]=bmp[i][j - 1];
        else
            bmp[i][j]=bmp[i+(1<<(j-1))][j-1];
}

void log(int n)
{
    int lg=-1,p=1;
    for(int i=1;i<=n;i++)
    {
        if(p==i)
        {
            log2[i]=++lg;
            p*=2;
        }
        else
            log2[i]=lg;
    }
}


int main()
{
    int m, x, y, k;
    fin>>n>> m;

    for(int i = 0; i < n; i++)
        fin >> v[i];

    rmq(n);
    log(n);
    for(int i = 0; i < m; i++)
    {
        fin>>x>>y;
        x--;
        y--;
        k = log2[y - x + 1];

        if(v[bmp[x][k]] < v[bmp[y - (1 << k) + 1][k]])
            fout<<v[bmp[x][k]]<<"\n";
        else
            fout<<v[bmp[y-(1 << k)+1][k]]<<"\n";
    }
    return 0;
}