Cod sursa(job #2799327)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 12 noiembrie 2021 21:29:19
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <stdio.h>

using namespace std;

#define MAXN 100000
#define INF 100001

int v[MAXN], rmq[MAXN][20];

int min(int a, int b){
  if(a < b){
    return a;
  }else{
    return b;
  }
}

int main()
{
    FILE *fin, *fout;
    int n, m, i, j, put, st, dr;
    fin = fopen("rmq.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    for(i = 0; i < n; i++){
      fscanf(fin, "%d", &v[i]);
    }
    for(i = 0; i < n; i++){
      for(j = 0; j < 20; j++){
        rmq[i][j] = INF;
      }
    }
    for(i = n - 1; 0 <= i; i--){
      rmq[i][0] = v[i];
      put = 2;
      j = 1;
      while((i + put - 1) < n){
        rmq[i][j] = min(rmq[i][j - 1], rmq[i + put / 2][j - 1]);
        put *= 2;
        j++;
      }
    }
    fout = fopen("rmq.out", "w");
    for(i = 0; i < m; i++){
      fscanf(fin, "%d%d", &st, &dr);
      put = 1;
      j = 0;
      while(put <= (dr - st + 1)){
        put *= 2;
        j++;
      }
      put /= 2;
      j--;
      fprintf(fout, "%d\n", min(rmq[st - 1][j], rmq[dr - put][j]));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}