Cod sursa(job #2320926)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 15 ianuarie 2019 13:47:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.76 kb
#include <stdio.h>
#include <iostream>
using namespace std;
FILE *in,*out;

int n,m;
int log2[100002],d[20][100002];



void read(){
  fscanf(in,"%d %d",&n,&m);
  for(int i=1;i<=n;i++)
    fscanf(in,"%d",&d[0][i]);
}

void form_log2(){
  log2[1]=0;
  for(int i=2;i<=n;i++)
    log2[i]=log2[i/2]+1;
}

void solve(){

  for(int i=1;i<=log2[n];i++){
    for(int j=1;j<=n-(1<<(i-1));j++)
      d[i][j]=min(d[i-1][j],d[i-1][j+(1<<(i-1))]);
  }

  int x,y,k;
  for(int i=1;i<=m;i++){
    fscanf(in,"%d %d",&x,&y);
    k=log2[y-x+1]; //2^k <= y-x
    fprintf(out,"%d\n",min(d[k][x],d[k][y-(1<<k)+1]));
  }
}

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

    read();
    form_log2();
    solve();
    return 0;
}