Cod sursa(job #2625305)

Utilizator killerdonuts358nicolae tudor killerdonuts358 Data 5 iunie 2020 21:06:26
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cmath>

using namespace std;

#define MAXN 100001
#define INF 100001

string s;

ifstream fin("rmq.in");
ofstream fout("rmq.out");
int input[MAXN];
int v[MAXN];

void init(unsigned index, int start, int end)
{
    if(start == end){
        v[index] = input[start - 1];
        return;
    }

    unsigned doubleIndex = index << 1u;
    init(doubleIndex, start, (start + end) / 2);
    init(doubleIndex + 1, (start + end) / 2 + 1, end);

    int minElement = min(v[doubleIndex], v[doubleIndex + 1]);
    v[index] = minElement;
}

int query(unsigned index, int start, int end, int left, int right)
{
    int minLeft, minRight;
    unsigned doubleIndex = index << 1u;
    if(end < left or start > right){
        return INF;
    }
    if(left <= start and end <= right){
        return v[index];
    }

    minLeft = query(doubleIndex, start, (start + end) / 2, left, right);
    minRight = query(doubleIndex + 1, (start + end) / 2 + 1, end, left, right);

    int minElement = min(minLeft, minRight);

    return minElement;
}

int main()
{
    int n, m, left, right;

    fin >> n >> m;
    for(int i = 0; i < n; ++i)
        fin >> input[i];

    init(1,1, n);

    while(m--){
        fin >> left >> right;
        fout << query(1, 1,n, left, right) << "\n";
    }

    return 0;
}