Pagini recente » Cod sursa (job #3127606) | Cod sursa (job #2951605) | Cod sursa (job #1129407) | Cod sursa (job #1251564) | Cod sursa (job #2625312)
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
#define MAXN 100001
#define INF 100001
string s;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int input[MAXN];
int v[MAXN * 17];
void init(unsigned index, int start, int end)
{
if(start == end){
v[index] = input[start - 1];
return;
}
unsigned doubleIndex = index << 1u;
init(doubleIndex, start, (start + end) / 2);
init(doubleIndex + 1, (start + end) / 2 + 1, end);
int minElement = min(v[doubleIndex], v[doubleIndex + 1]);
v[index] = minElement;
}
int query(unsigned index, int start, int end, int left, int right)
{
int minLeft, minRight;
unsigned doubleIndex = index << 1u;
if(end < left or start > right){
return INF;
}
if(left <= start and end <= right){
return v[index];
}
minLeft = query(doubleIndex, start, (start + end) / 2, left, right);
minRight = query(doubleIndex + 1, (start + end) / 2 + 1, end, left, right);
int minElement = min(minLeft, minRight);
return minElement;
}
int main()
{
int n, m, left, right;
fin >> n >> m;
for(int i = 0; i < n; ++i)
fin >> input[i];
init(1,1, n);
while(m--){
fin >> left >> right;
fout << query(1, 1,n, left, right) << "\n";
}
return 0;
}