Cod sursa(job #2646170)

Utilizator anabatAna Batrineanu anabat Data 31 august 2020 10:59:44
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>

using namespace std;

#include <algorithm>
#define NMAX 100000
#define POW2 17

int rmq[NMAX+1][POW2],v[NMAX+1];

void Rmq(int n){
  int i,j;
  for(i=0;i<n;i++)
    rmq[i][0]=i;
  for(j=1;(1<<j)<=n;j++){
    for(i=0;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 power(int n){
  int i,pow;
  pow=1;
  i=0;
  while(pow<=n){
    pow*=2;
    i++;
  }
  return (i-1);
}

int main()
{
  FILE *fin,*fout;
  fin=fopen("rmq.in","r");
  fout=fopen("rmq.out","w");

  int n,m,i,j,k,rasp,x,y;
  fscanf(fin,"%d%d",&n,&m);
  for(i=0;i<n;i++){
    fscanf(fin,"%d",&v[i]);
  }
  Rmq(n);
  for(i=0;i<m;i++){
    fscanf(fin,"%d%d",&x,&y);
    x--,y--;
    k=power(y-x+1);
    fprintf(fout,"%d\n",std::min(v[rmq[x][k]],v[rmq[y-(1<<k)+1][k]]));
  }

  fclose(fin);
  fclose(fout);
  return 0;
}