Cod sursa(job #2808910)

Utilizator natrovanCeval Marius natrovan Data 25 noiembrie 2021 17:23:34
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include <stdlib.h>
#include <vector>

#include <stdlib.h>
#include <string.h>
#include <cmath>

#define GO_UP(x) (((x)-1) >> 1)
#define GO_LEFT(x) (((x) << 1) + 1)
#define GO_RIGHT(x) (((x) << 1) + 2)

using namespace std;

void read_vector(vector<int> &v, int n)
{
    for (int i = 0; i < n; i++)
    {
        int x;
        cin >> x;
        v.push_back(x);
    }
}

void build_segment_tree(int *segment_tree, vector<int> &v, int pos, int left, int right)
{
    if (left == right)
    {
        segment_tree[pos] = v[left];
        return;
    }

    int mid = (left + right) / 2;

    build_segment_tree(segment_tree, v, GO_LEFT(pos), left, mid);
    build_segment_tree(segment_tree, v, GO_RIGHT(pos), mid + 1, right);

    segment_tree[pos] = min(segment_tree[GO_LEFT(pos)], segment_tree[GO_RIGHT(pos)]);
}

int query(int *segment_tree, int pos, int left, int right, int query_left, int query_right)
{
    if (left == query_left && right == query_right)
        return segment_tree[pos];

    int mid = (left + right) / 2;

    if (query_right <= mid)
    {
        return query(segment_tree, GO_LEFT(pos), left, mid, query_left, query_right);
    }

    if (mid < query_left)
    {
        return query(segment_tree, GO_RIGHT(pos), mid + 1, right, query_left, query_right);
    }

    return min(
        query(segment_tree, GO_LEFT(pos), left, mid, query_left, mid),
        query(segment_tree, GO_RIGHT(pos), mid + 1, right, mid + 1, query_right));
}

void read_query(int *segment_tree, int n, int m)
{
    for (int i = 0; i < m; i++)
    {
        int x, y;
        cin >> x >> y;
        x--;
        y--;
        cout << query(segment_tree, 0, 0, n - 1, x, y) << '\n';
    }
}

int main()
{
    int n, m;
    cin >> n >> m;

    vector<int> v;
    read_vector(v, n);

    //Height of segment tree
    int x = (int)(ceil(log2(n)));
    // Maximum size of segment tree
    int max_size = 2 * (int)pow(2, x) - 1;
    int *segment_tree = new int[max_size];
    build_segment_tree(segment_tree, v, 0, 0, v.size() - 1);

    read_query(segment_tree, n, m);

    return 0;
}