Cod sursa(job #2819455)

Utilizator albertaizicAizic Albert albertaizic Data 18 decembrie 2021 13:15:45
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>

#define MAX_N 100000
#define MAX_LOG 16

int v[MAX_N];
int table[MAX_N][MAX_LOG + 1];
int log2[MAX_N + 1];

inline int f(int x,int y){
  return x < y ? x : y;
}

void precomputeLogs(int n){
  int i;

  log2[1]=0;

  for(i=2;i<=n;i++)
    log2[i]=log2[i/2]+1;
}

void build(int n){
  int i, p;

  for(i=0;i<n;i++){
    table[i][0]=v[i];
  }

  for(p=1;p<MAX_LOG;p++){
    for(i=0;i+(1<<p)-1<n;i++){
      table[i][p]= f(table[i][p-1], table[i+(1<<(p-1))][p-1]);
    }
  }
}

int query(int left,int right){
  int pos;
  pos=log2[right-left+1];
  return f(table[left][pos],table[right-(1<<pos)+1][pos]);
}
int main(){
  FILE *fin,*fout;
  int n,m,i,a,b;

  fin=fopen("rmq.in","r");
  fout=fopen("rmq.out","w");

  fscanf(fin,"%d%d",&n,&m);
  for(i=0;i<n;i++)
    fscanf(fin,"%d",&v[i]);

  precomputeLogs(n);
  build(n);

  while(m--){
    fscanf(fin,"%d%d",&a,&b);
    fprintf(fout,"%d\n",query(a-1,b-1));
  }

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