Pagini recente » Cod sursa (job #2054941) | Cod sursa (job #1059920) | Cod sursa (job #2923751) | Cod sursa (job #2238918) | Cod sursa (job #2000805)
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
#define cin fin
#define cout fout
#define MAX 500
int lookup[MAX][MAX];
int a[100005];
struct Query
{
int L, R;
};
Query q[1000005];
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-(int)pow(2,j)+1][j]])
return arr[lookup[L][j]];
else return arr[lookup[R-(int)pow(2,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;
cout << query(arr, L, R) << '\n';;
}
}
int main()
{
int n, m;
fin >> n >> m;
for(int i = 0; i < n; ++i)
fin >> a[i];
for(int i = 0; i < m; ++i)
{
int nr1, nr2;
fin >> nr1 >> nr2;
q[i].L = nr1 - 1;
q[i].R = nr2 - 1;
}
RMQ(a, n, q, m);
return 0;
}