Cod sursa(job #2808917)

Utilizator natrovanCeval Marius natrovan Data 25 noiembrie 2021 17:33:46
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#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;
}