Pagini recente » Cod sursa (job #1440681) | Cod sursa (job #481396) | Cod sursa (job #1669707) | Cod sursa (job #601816) | Cod sursa (job #2619712)
#include <fstream>
#include <cmath>
#include <unordered_map>
#include <iostream>
std::ifstream in("rmq.in");
std::ofstream out("rmq.out");
#define MAX 10000
int lookup[MAX][MAX];
struct Query
{
int L, R;
};
void preprocess(int arr[], int n)
{
for (int i = 0; i < n; i++)
lookup[i][0] = i;
for (int j=1; (1<<j)<=n; j++)
{
for (int i=0; (i+(1<<j)-1) < n; i++)
{
if (arr[lookup[i][j-1]] < arr[lookup[i + (1<<(j-1))][j-1]])
lookup[i][j] = lookup[i][j-1];
else
lookup[i][j] = lookup[i + (1 << (j-1))][j-1];
}
}
}
int query(int arr[], int L, int R)
{
int j = (int)log2(R-L+1);
if (arr[lookup[L][j]] <= arr[lookup[R - (1<<j) + 1][j]])
return arr[lookup[L][j]];
else return arr[lookup[R - (1<<j) + 1][j]];
}
void RMQ(int arr[], int n, Query q[], int m)
{
preprocess(arr, n);
for (int i=0; i<m; i++)
{
int L = q[i].L, R = q[i].R;
out << query(arr, L-1, R-1) << "\n";
}
}
int main()
{
int n, m;
in >> n >> m;
int a[n];
Query b[m];
for (int i = 0; i < n; i ++)
in >> a[i];
for (int j = 0; j < m; j ++)
in >> b[j].L >> b[j].R;
RMQ(a,n,b,m);
return 0;
}