Cod sursa(job #2819576)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 18 decembrie 2021 17:20:04
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 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];
inline uint32_t invervalValue(uint32_t left, uint32_t right, uint32_t n);
inline void getValue(uint32_t index, uint32_t power, uint32_t n);

void getValue(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(index, power - 1, n);

  getValue(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 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 < 20; j++) {

      mem[j][i] = (1<<30);

    }

  }

  for(uint32_t i = 0; i < n; i++) {

    for(uint32_t j = 0; (1 << j) < n; j++) {

      getValue(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(a - 1, b - 1, n));

  }

}