Cod sursa(job #2819562)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 18 decembrie 2021 17:01:46
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 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];
bool memt[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) {
    memt[0][index] = 1;
    mem[0][index] = x[index];
    return ;
  }
  if(memt[power][index]) {
    return ;
  }
  getValue(mem, x, index, power - 1, n);
  getValue(mem, x, index + (1 << (power - 1)), power - 1, n);
  memt[power][index] = 1;
  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("arbint.in", "r+");
  FILE *fr = fopen("rmq.out", "w+");
  uint32_t n, m;
  fscanf(fd, "%d %d", &n, &m);
  for(uint32_t i = 0; i < n; i++) {
    fscanf(fd, "%d", &x[i]);
  }
  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));
  }
}