Cod sursa(job #2969958)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 23 ianuarie 2023 22:11:25
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>
const int NMAX=100005;
const int LOGMAX=25;

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

void construct_rmq();
int query(int, int);
int l(int);

int n, m;
int rmq[LOGMAX][NMAX];

int main()
{
  int i, a, b;
  fin>>n>>m;
  for(i=1; i<=n; i++) fin>>rmq[0][i];
  construct_rmq();
  for(i=1; i<=m; i++)
  {
    fin>>a>>b;
    fout<<query(a, b)<<'\n';
  }
}

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

int query(int st, int dr)
{
  int lg=l(dr-st+1);
  return min(rmq[lg][st+(1<<lg)-1], rmq[lg][dr]);
}

int l(int nr)
{
  int p=0;
  while((1<<p)<=nr) p++;
  return p-1;
}