Cod sursa(job #2902836)

Utilizator andriciucandreeaAndriciuc Andreea andriciucandreea Data 16 mai 2022 20:55:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

vector <int> values(100001);
vector <int> nodes(400100);

void construct(int pos, int left, int right)
{
    if(left ==  right)
    {
        nodes[pos] = values[left];
        return;
    }
    construct(pos*2, left, (left + right)/2);
    construct(pos*2+1, (left + right)/2+1, right);
    nodes[pos] = min(nodes[pos*2], nodes[2*pos+1]);
}

int min_value(int pos, int left, int right, int start, int finish)
{
    if(start <= left && right <= finish)
        return nodes[pos];
    int mid = (left + right) / 2, v1 = 1<<30, v2 = 1<<30;
    if(start <= mid)
        v1 = min_value(pos * 2, left, mid, start, finish);
     if(finish > mid)
        v2 = min_value(pos * 2 + 1, mid + 1, right, start, finish);
    return min(v1, v2);
}

int main()
{
    int n, m;
    fin>>n>>m;
    for(int  i = 1; i <= n; i++)
        fin>>values[i];
    construct(1, 1, n);

    for(int i = 0; i < m; i++)
    {
        int  a, b;
        fin>>a>>b;
        fout<<min_value(1, 1, n, a, b)<<'\n';
    }
    return 0;

}