Pagini recente » Cod sursa (job #445116) | Cod sursa (job #1710101) | Cod sursa (job #428218) | Cod sursa (job #1935013) | Cod sursa (job #1476213)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <cmath>
#include <bitset>
#include <utility>
#include <stack>
#define MAXN 50005
using namespace std;
int v[100005], segmTree[400005];
void build(int p, int L, int R);
int query(int p, int L, int R, int i, int j);
inline int left(int p) { return p << 1; };
inline int right(int p) { return (p << 1) + 1; };
int main() {
int n, i, m, a, b;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
fin >> n >> m;
for (i = 0; i < n; ++i)
fin >> v[i];
build(1, 0, n-1);
for (i = 0; i < m; ++i) {
fin >> a >> b;
fout << v[query(1, 0, n - 1, a - 1, b - 1)] << '\n';
}
return 0;
}
void build(int p, int L, int R) {
if (L == R)
segmTree[p] = L;
else {
build(left(p), L , (L + R) / 2);
build(right(p), (L + R) / 2 + 1, R);
int p1 = segmTree[left(p)];
int p2 = segmTree[right(p)];
segmTree[p] = (v[p1] <= v[p2]) ? p1 : p2;
}
}
int query(int p, int L, int R, int i, int j) {
if (i > R || j < L)
return -1;
if (L >= i && R <= j)
return segmTree[p];
int p1 = query(left(p), L, (L + R) / 2, i, j);
int p2 = query(right(p), (L + R) / 2 + 1, R, i, j);
if (p1 == -1)
return p2;
if (p2 == -1)
return p1;
return (v[p1] <= v[p2]) ? p1 : p2;
}