Cod sursa(job #2492453)

Utilizator NineshadowCarapcea Antonio Nineshadow Data 14 noiembrie 2019 19:41:29
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>
#define MAXN 100005
#define MAXQ 1000005

using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");


int n, m, a[MAXN], parent[MAXN], ans[MAXQ];
int find_set(int v) {
    if (v == parent[v])
        return v;
    return parent[v] = find_set(parent[v]);
}


struct Query {
    int L, R, idx;
    Query(int L, int R, int idx):L(L),R(R),idx(idx){}
};

vector<int> answer;
vector<Query> container[MAXN];

int main()
{
    in >> n >> m;
    for(int i = 0; i < n; i++)  {
        in >> a[i];
        parent[i] = i;
    }
    
    for(int i = 0; i < m; i++) {
        int l, r;
        in >> l >> r;
        --l;
        --r;
        container[r].push_back(Query(l,r,i));
    }
    stack<int> s;
    for (int i = 0; i < n; i++) {
        while (!s.empty() && a[s.top()] > a[i]) {
            parent[s.top()] = i;
            s.pop();
        }
        s.push(i);
        for (Query q : container[i]) {
            ans[q.idx] = a[find_set(q.L)];
        }
    }
    for(int i = 0; i < m; i++)
        out << ans[i] << '\n';
    return 0;
}