Cod sursa(job #2921663)

Utilizator albertaizicAizic Albert albertaizic Data 1 septembrie 2022 12:33:33
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <stdio.h>
using namespace std;
#define MAX_N 100000
#define MAX_LOG 16
int v[MAX_N+1][MAX_LOG+1];
int log2[MAX_N+1];

inline int f(int a,int b){
  return a<b?a:b;
}

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(p=1;p<=MAX_LOG;p++)
    for(i=0;i+(1<<p)-1<n;i++)
      v[i][p]=f(v[i][p-1],v[i+(1<<(p-1))][p-1]);

}

int query(int a,int b){
  int log,len;
  len=b-a+1;
  log=log2[len];
  return f(v[a][log],v[b-(1<<log)+1][log]);
}

int main(){
    FILE *fin,*fout;
    int m,n,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][0]);
    }

    precomputeLogs(n);
    build(n);

    for(i=0;i<m;i++){
      fscanf(fin,"%d%d",&a,&b);
      fprintf(fout,"%d\n",query(a-1,b-1));
    }


    fclose(fout);
    return 0;
}