Cod sursa(job #1997417)

Utilizator zanugMatyas Gergely zanug Data 4 iulie 2017 11:54:41
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

const int N = 1e5+10;
const int M = 1e7+10;

const int INF = 1e9;

int v[N];
int x[M];///?
int n, m;
int lef, rig;

int left(int i)
{
    return 2*i + 1;
}
int right(int i)
{
    return 2*i + 2;
}

int get(int node, int l, int r, int ll, int rr)
{
    if(l >= ll && r <= rr)
    {
        return x[node];
    }

    if(r < ll || l > rr)
    {
        return INF;
    }

    int mid = (l + r) / 2;
    return min(get(left(node), l, mid, ll, rr), get(right(node), mid+1, r, ll, rr));
}

void build(int node, int l, int r)
{
    if(l == r)
    {
        x[node] = v[l];
        return;
    }

    int mid = (l + r) / 2;
    build(left(node), l, mid);
    build(right(node), mid+1, r);
    x[node] = min(x[left(node)], x[right(node)]);
}

int main()
{
    fin >> n >> m;
    for(int i = 0; i < n; ++i)
    {
        fin >> v[i];
    }

    build(0, 0, n-1);

    for(int i = 0; i < m; ++i)
    {
        fin >> lef >> rig;

        --lef;
        --rig;

        //cout << lef << " " << rig << "\t";

        fout << get(0, 0, n-1, lef, rig) << "\n";
    }

    return 0;
}