Pagini recente » Cod sursa (job #1751619) | Cod sursa (job #1997485) | Cod sursa (job #422867) | Cod sursa (job #2394390) | Cod sursa (job #2295246)
#include "algo.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
std::vector<int> rmq(const std::vector<int>& input, const std::vector< std::pair<int, int> >& queries) {
vector<int> r;
int N, M, dim;
N = input.size();
M = queries.size();
dim = sqrt(N);
vector<int> min_sqrt;
for (int i = 0; i < dim; i++){
min_sqrt.push_back(99999999);
for (int j = i * dim; j < (i+1) * dim; j++) {
if (min_sqrt[i] > input[j])
min_sqrt[i] = input[j];
}
}
for (int i = 0; i < M; i++) {
int f, l, s, d, m, j;
f = queries[i].first;
l = queries[i].second;
if (f == l)
r.push_back(input[f]);
else {
for (j = 0; j * dim < f; j++);
j++;
s = min((j - 1) * dim, l);
m = 999999999;
for (;dim * j <= l; j++){
m = min(m, min_sqrt[j - 1]);
}
d = max (dim * (j - 1), f);
for (j = f; j <= s; j++){
m = min(m, input[j]);
}
for (j = d; j <= l; j++){
m = min(m, input[j]);
}
r.push_back(m);
}
}
return r;
}
int main()
{
int N, M, x, y;
fin >> N >> M;
vector<int> raspuns(M, 0);
vector<int> v;
vector< pair<int, int> > queries;
for (int i = 0; i < N; i++) {
fin >> x;
v.push_back(x);
}
for (int i = 0; i < M; i++) {
fin >> x >> y;
queries.push_back(make_pair(x, y));
}
raspuns = rmq(v, queries);
for (int i = 0; i < M; i++) {
fout << raspuns[i] << "\n";
}
return 0;
}