Cod sursa(job #2672628)

Utilizator maraboneaMara Bonea marabonea Data 14 noiembrie 2020 12:14:48
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.75 kb
#include <fstream>

using namespace std;

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

const int nmax = 100005;
const int lmax = 20;
int n,m;
int vt[nmax],log2[nmax];
int rmq[lmax][lmax];

void citire()
{
  fin>>n>>m;
  for(int i=1;i<=n;i++)
    {
        fin>>vt[i];
        rmq[0][i]=vt[i];
    }
}

void precalc()
{
  for(int i=2;i<=n;i++)
    log2[i]=log2[i/2]+1;
  for(int i=1;(1<<i)<=n;i++)
    for(int j=1;j<=n-(1<<i)+1;j++)
        rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}

void rezolv()
{
  while(m--)
  {
    int x,y;
    fin>>x>>y;
    int k=log2[y-x+1];
    fout<<min(rmq[k][x],rmq[k][y-(1<<k)+1])<<"\n";
  }
}

int main()
{
    citire();
    precalc();
    rezolv();
    return 0;
}