Pagini recente » Cod sursa (job #2204085) | Cod sursa (job #1150948) | Cod sursa (job #1502542) | Cod sursa (job #1830083) | Cod sursa (job #1982158)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
void rmq(vector<int> &x, vector<vector<int> > &m) {
m.resize(x.size(), vector<int>(int(log2(x.size()))+1));
for(int i=0; i<x.size(); ++i)
m[i][0] = i;
for(int j=1; 1 << j <= x.size(); ++j) {
for(int i=0; i + (1 << j) - 1 < x.size(); ++i) {
if(x[m[i][j-1]] < x[m[i + (1 << (j-1))][j-1]])
m[i][j] = m[i][j-1];
else
m[i][j] = m[i + (1 << (j-1))][j-1];
}
}
}
int main() {
int n, l;
f >> n >> l;
vector<int> x(n);
for(auto &it: x) {
f >> it;
}
vector<vector<int> > m;
rmq(x, m);
int q, w;
for(int i=0; i<l; ++i) {
f >> q >> w;
--q;
--w;
int k = log2(w-q+1);
int first, second;
if((first = x[m[q][k]]) <= (second = x[m[w-(1 << k)+1][k]]))
g << first << '\n';
else
g << second << '\n';
}
}