Cod sursa(job #2819555)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 18 decembrie 2021 16:48:43
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <stdio.h>
#include <unordered_map>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <cassert>

using namespace std;

uint32_t mem[25][100003];
uint32_t x[100004];

void getValue(uint32_t mem[][100003], uint32_t *x, uint32_t index, uint32_t power, uint32_t n) {
  if(!power) {
    mem[0][index] = x[index];
    return ;
  }
  if(mem[power][index] != 1<<30) {
    return ;
  }
  getValue(mem, x, index, power - 1, n);
  getValue(mem, x, index + (1 << (power - 1)), power - 1, n);
  mem[power][index] = min(mem[power - 1][index], mem[power - 1][index + (1 << (power - 1))]);
}

uint32_t invervalValue(uint32_t mem[][100003], uint32_t left, uint32_t right, uint32_t n) {
  uint32_t minim = 1<<30, index = 0, diff = right - left + 1;
  while(diff) {
    if(diff & 1) {
      minim = min(minim, mem[index][left]);
      left += (1 << index);
    }
    diff >>= 1;
    index++;
  }
  return minim;
}

int main() {
  FILE *fd = fopen("rmq.in", "r+");
  FILE *fr = fopen("rmq.out", "w+");
  uint32_t n, m;
  fscanf(fd, "%d %d", &n, &m);
  memset(x, 253, sizeof(uint32_t) * 100004);
  for(uint32_t i = 0; i < n; i++) {
    fscanf(fd, "%d", &x[i]);
    for(uint32_t j = 0; j < 25; j++) {
      mem[j][i] = (1<<30);
    }
  }
  for(uint32_t i = 0; i < n; i++) {
    for(uint32_t j = 0; (1 << j) < n; j++) {
      getValue(mem, x, i, j, n);
    }
  }
  for(int32_t i = 0; i < m; i++) {
    uint32_t a, b;
    fscanf(fd, "%d %d", &a, &b);
    fprintf(fr, "%d\n", invervalValue(mem, a - 1, b - 1, n));
  }
}