Pagini recente » Cod sursa (job #2861611) | Cod sursa (job #220579) | Cod sursa (job #3128911) | Cod sursa (job #2529563) | Cod sursa (job #2138298)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
#include <cmath>
#define Nmax 100000
#define Logmax 17
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int n, Q;
vector<int> v;
int sparsedTable[Nmax][Logmax];
void read()
{
in >> n >> Q; int x;
for(int i=1; i<=n; i++)
{
in >> x;
v.push_back(x);
}
}
int pow2(int x)
{
return 1<<x;
}
void preprocessing()
{
for(int i=0; i<n; i++)
sparsedTable[i][0] = i;
for(int j=1; j<=floor(log2(n)); j++)
for(int i=0; i+pow2(j)-1<n; i++)
{
int a = sparsedTable[i][j-1];
int b = sparsedTable[i+pow2(j-1)][j-1];
sparsedTable[i][j] = v[a]<v[b] ? a:b;
}
}
int query(int low, int high)
{
int L = high-low+1;
int k = floor(log2(L));
int a = sparsedTable[low][k];
int b = sparsedTable[high-pow2(k)+1][k];
return min(v[a], v[b]);
}
/*
void showSparsedTable()
{
for(int i=0; i<n; i++)
{
for(int j=0; j<=floor(log2(n)); j++)
cout << sparsedTable[i][j] << " ";
cout<<endl;
}
cout<<endl<<endl;
}*/
int main()
{
read();
preprocessing();
int a,b;
for(int i=1; i<=Q; i++)
{
in>>a>>b;
out<<query(a-1,b-1)<<'\n';
}
}