Pagini recente » Cod sursa (job #1896874) | Cod sursa (job #1129466) | Cod sursa (job #2144299) | Cod sursa (job #1781278) | Cod sursa (job #2742612)
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "rmq.in" );
ofstream fout( "rmq.out" );
template<typename T> struct rmq {
vector<T> v;
int n; static const int b = 30;
vector<int> mask, t;
void reset(const vector<T>& v_) {
v = v_;
n = v.size();
mask = n;
t = n;
for (int i = 0, at = 0; i < n; mask[i++] = at |= 1) {
at = (at<<1)&((1<<b)-1);
while (at and op(i, i-msb(at&-at)) == i) at ^= at&-at;
}
for (int i = 0; i < n/b; i++) t[i] = small(b*i+b-1);
for (int j = 1; (1<<j) <= n/b; j++) for (int i = 0; i+(1<<j) <= n/b; i++)
t[n/b*j+i] = op(t[n/b*(j-1)+i], t[n/b*(j-1)+i+(1<<(j-1))]);
}
int op(int x, int y) { return v[x] < v[y] ? x : y; }
int msb(int x) { return __builtin_clz(1)-__builtin_clz(x); }
int small(int r, int sz = b) { return r-msb(mask[r]&((1<<sz)-1)); }
rmq(const vector<T>& v_) : v(v_), n(v.size()), mask(n), t(n) {
for (int i = 0, at = 0; i < n; mask[i++] = at |= 1) {
at = (at<<1)&((1<<b)-1);
while (at and op(i, i-msb(at&-at)) == i) at ^= at&-at;
}
for (int i = 0; i < n/b; i++) t[i] = small(b*i+b-1);
for (int j = 1; (1<<j) <= n/b; j++) for (int i = 0; i+(1<<j) <= n/b; i++)
t[n/b*j+i] = op(t[n/b*(j-1)+i], t[n/b*(j-1)+i+(1<<(j-1))]);
}
T query(int l, int r) {
if (r-l+1 <= b) return v[small(r, r-l+1)];
int ans = op(small(l+b-1), small(r));
int x = l/b+1, y = r/b-1;
if (x <= y) {
int j = msb(y-x+1);
ans = op(ans, op(t[n/b*j+x], t[n/b*j+y-(1<<j)+1]));
}
return v[ans];
}
};
int main(){
using X1 = rmq<int>;
int n, q, i, x, y;
fin >> n >> q;
vector <int> a(n + 1);
for( i = 1; i <= n; ++i ){
fin >> x;
a[i] = x;
}
X1 pl(a);
while( q-- ){
fin >> x >> y;
fout << pl.query(x, y) << "\n";
}
return 0;
}