Pagini recente » Cod sursa (job #2324599) | Cod sursa (job #2794486) | Cod sursa (job #2976847) | Cod sursa (job #2783381) | Cod sursa (job #2808917)
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
using namespace std;
int **read_sparse_table(int n, int &m)
{
int **sparse_table = (int **)malloc(n * sizeof(*sparse_table));
m = (int)log2(n) + 1;
for (int i = 0; i < n; i++)
{
sparse_table[i] = (int *)calloc(m, sizeof(*sparse_table[i]));
cin >> sparse_table[i][0];
}
return sparse_table;
}
void build_sparse_tables(int **sparse_table, int n, int m)
{
for (int j = 1; j < m; j++)
{
for (int i = 0; i <= n - (1 << j); i++)
{
sparse_table[i][j] = min(
sparse_table[i][j - 1],
sparse_table[i + (1 << (j - 1))][j - 1]);
}
}
}
int query(int **sparse_table, int n, int m, int left, int right)
{
int k = (int)log2(right - left + 1);
return min(
sparse_table[left][k],
sparse_table[right - (1 << k) + 1][k]);
}
void read_query(int **sparse_table, int n, int m, int num_queries)
{
for (int i = 0; i < num_queries; i++)
{
int x, y;
cin >> x >> y;
x--;
y--;
cout << query(sparse_table, n, m, x, y) << '\n';
}
}
int main()
{
int n, num_queries, m;
cin >> n >> num_queries;
int **sparse_table = read_sparse_table(n, m);
build_sparse_tables(sparse_table, n, m);
read_query(sparse_table, n, m, num_queries);
return 0;
}