Pagini recente » Cod sursa (job #646138) | Cod sursa (job #2772696) | Cod sursa (job #728202) | Cod sursa (job #2170027) | Cod sursa (job #2819576)
#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));
}
}