Cod sursa(job #3128699)

Utilizator SorinBossuMarian Sorin SorinBossu Data 10 mai 2023 14:34:41
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
struct query
{
    query(int i1, int i2, int i3, int i4):st(i1), dr(i2), id(i3), rez(i4)
    {
    }
    int st, dr, id, rez = -1;
};
vector<query> q;
int a[1000001], p[1000001], d[1000001];

void add(int n)
{
    p[n] = n;
    d[n] = 1;

}

int find_set(int n)
{
   if ( p[n] == n )
        return n;

   p[n] = find_set(p[n]);
   return p[n] ;
}

int main()
{
    int n, m;
    in >> n >> m;
    for ( int i = 1; i <= n; ++i )
        in >> a[i], add(i);
    for ( int i = 1; i <= m; ++i )
    {
        int st, dr;
        in >> st >> dr;
        q.emplace_back(st, dr, i, -1);
    }
    std::sort(q.begin(), q.end(),[](query q1, query q2)
        {
        if ( q1.dr < q2.dr)
                return true;
        else return false;
        });
    int cnt = 0;
    stack<pair<int,int>> s;
    for ( int i = 1; i <= n; ++i )
    {
        while(!s.empty() and s.top().first > a[i] )
        {
            auto nr = s.top();
            s.pop();
            p[nr.second] = i;
        }
        s.emplace(a[i],i);
        while(q[cnt].dr == i and cnt <= m)
        {
            q[cnt].rez = a[find_set(q[cnt].st)];
            cnt++;
        }
    }
    std::sort(q.begin(), q.end(),[](query q1, query q2)
        {
        if ( q1.id < q2.id)
                return true;
        else return false;
        });
    for ( auto c:q)
        out << c.rez << "\n";
    return 0;
}