Cod sursa(job #1700911)

Utilizator TincaMateiTinca Matei TincaMatei Data 11 mai 2016 18:42:46
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>
#define MAX_N 100000
#define MAX_LOGN 16

int rmq[1+MAX_N][1+MAX_LOGN];
int logn[1+MAX_N], p2[1+MAX_LOGN];

void puteri() {
  int maxP2, exp, i;
  maxP2 = 2;
  exp = 0;
  for(i = 1; i <= MAX_N; i++) {
    if(i == maxP2) {
      maxP2 *= 2;
      exp++;
    }
    logn[i] = exp;
  }
  i = 0;
  maxP2 = 1;
  while(maxP2 <= MAX_N) {
    p2[i] = maxP2;
    i++;
    maxP2 = maxP2 * 2;
  }
}

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

int main() {
  int n, i, q, j, x, y, bestLog;
  puteri();
  FILE *fin = fopen( "rmq.in" , "r" );
  fscanf(fin, "%d%d", &n, &q);
  for(i = 1; i <= n; i++)
    fscanf(fin, "%d", &rmq[i][0]);

  for(j = 1; j <= logn[n]; j++)
    for(i = 1; i <= n - p2[j] + 1; i++)
      rmq[i][j] = min(rmq[i][j - 1], rmq[i + p2[j - 1]][j - 1]);

  FILE *fout = fopen( "rmq.out" , "w" );

  for(i = 1; i <= q; i++) {
    fscanf(fin, "%d%d", &x, &y);
    bestLog = logn[y - x + 1];
    fprintf(fout, "%d\n", min(rmq[x][bestLog], rmq[y - p2[bestLog] + 1][bestLog]));
  }

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