Cod sursa(job #3348219)

Utilizator unomMirel Costel unom Data 20 martie 2026 11:24:25
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
//solutie misto cu dsu (arpa's trick)

#include <fstream>
#include <vector>
#include <stack>

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");
int n, q;
int v[100005];
int tata[100005];
vector<pair<int, int>> qs[1000005];
int ans[1000005];

int rad(int x)
{
    if(x == tata[x])
    {
        return x;
    }

    int r = rad(tata[x]);
    tata[x] = r;
    return r;
}

int main()
{
    in>>n>>q;
    for(int i = 1; i<=n; i++)
    {
        in>>v[i];

        tata[i] = i;
    }

    int x, y;
    for(int i = 1; i<=q; i++)
    {
        in>>x>>y;

        qs[y].push_back({x, i});
    }

    stack<int> s;
    for(int i = 1; i<=n; i++)
    {
        while(!s.empty() && v[s.top()] > v[i])
        {
            tata[s.top()] = i;
            s.pop();
        }
        s.push(i);

        for(auto it: qs[i])
        {
            ans[it.second] = v[rad(it.first)];
        }
    }

    for(int i = 1; i<=q; i++)
    {
        out<<ans[i]<<'\n';
    }

    return 0;
}