Pagini recente » Cod sursa (job #1521142) | Cod sursa (job #795513) | Cod sursa (job #1464845) | Cod sursa (job #2074809) | Cod sursa (job #3194066)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int kN = 1e5;
const int kM = 1e6;
int n, root, v[kN], st[kN], ans[kM], anc[kN], up[kN], sz[kN];
vector<int> adj[kN];
vector<pair<int, int>> qs[kN];
void buidTree() {
int head = -1;
for(int i = 0; i < n; i++) {
int last = -1;
while(head >= 0 && v[st[head]] >= v[i]) {
last = st[head];
head--;
}
if(head >= 0) {
// p[i] = st[head];
adj[st[head]].emplace_back(i);
} else {
root = i;
}
if(last >= 0) {
// p[last] = i;
adj[i].emplace_back(last);
}
head++;
st[head] = i;
}
}
void makeSet(int u) {
up[u] = u;
sz[u] = 1;
}
int findRoot(int u) {
if(u == up[u]) {
return u;
}
return up[u] = findRoot(up[u]);
}
bool unite(int u, int v) {
u = findRoot(u);
v = findRoot(v);
if(u == v) {
return false;
}
if(sz[u] > sz[v]) {
swap(u, v);
}
up[u] = v;
sz[v] += sz[u];
return true;
}
void dfs(int u = root) {
makeSet(u);
anc[u] = u;
for(const auto &it: adj[u]) {
dfs(it);
unite(u, it);
anc[findRoot(it)] = u;
}
for(const auto &it: qs[u]) {
int lca = anc[findRoot(it.first)];
ans[it.second] = v[lca];
}
}
int main() {
int m;
fin >> n >> m;
for(int i = 0; i < n; i++) {
fin >> v[i];
}
buidTree();
for(int i = 0; i < m; i++) {
int l, r;
fin >> l >> r;
l--; r--;
qs[l].emplace_back(r, i);
qs[r].emplace_back(l, i);
}
dfs();
for(int i = 0; i < m; i++) {
fout << ans[i] << '\n';
}
return 0;
}