Pagini recente » Cod sursa (job #2894521) | Cod sursa (job #1689041) | Cod sursa (job #901900) | Cod sursa (job #2454363) | Cod sursa (job #3128699)
#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;
}