Cod sursa(job #2819672)

Utilizator teodortatomirTeodor Tatomir teodortatomir Data 18 decembrie 2021 19:59:23
Problema Range minimum query Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXX 100000

int mat[MAXX][17];
int v[MAXX],l[17];

void calc(int n) {
  int i, put, minn, nr;

  for(i = 0; i < n; i++)
    mat[i][0] = v[i];
  for(put = 1; put <= 17; put++) {
    nr = 1 << put;
    for(i = 0; i + put - 1 < n; i++) {
      minn = mat[i][put-1];
      if(mat[i+nr][put-1] < minn)
        minn = mat[i+nr][put-1];
      mat[i][put] = minn;
    }
  }
}
void putere(int n) {
  int i;

  for(i = 2; i <= n; i++)
    l[i] = l[i / 2] + 1;
}
int rasp(int st, int dr) {
  int p, put, minn;

  p = l[st - dr + 1];
  put = 1 << p;
  minn = mat[st][p];
  if(mat[dr - put + 1][p] < minn)
    minn = mat[dr - put + 1][p];
  return minn;
}
int main(){
  FILE *fin,*fout;
  int n,m,i,st,dr,af;

  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]);

  putere(n);
  calc(n);

  for(i = 0; i < m; i++) {
    fscanf(fin, "%d%d", &st, &dr);
    st--;
    dr--;
    af = rasp(st, dr);
    fprintf(fout, "%d\n", af);
  }

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