Pagini recente » Cod sursa (job #1561694) | Cod sursa (job #1741824) | Istoria paginii runda/agm2018runda1 | Statistici Oswald Ingalls (dictitadtio82) | Cod sursa (job #1982170)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("rmq.in");
ofstream os("rmq.out");
int n, m;
vector<int> A;
vector<int> K;
int M[100001][1000];
void RMQ();
int Query(int a, int b);
void Preprocesare();
int main()
{
is >> n >> m;
A.push_back(0);
for ( int i = 0, x; i < n; ++i )
{
is >> x;
A.push_back(x);
}
Preprocesare();
RMQ();
for ( int i = 0, a, b; i < m; ++i )
{
is >> a >> b;
os << Query(a, b) << '\n';
}
is.close();
os.close();
return 0;
}
void RMQ()
{
//M.resize(n+1);
//return;
// for ( int i = 1; i <= n; ++i )
// M[i].resize(n);
for ( int i = 1; i <= n; ++i )
M[i][0] = i;
for ( int j = 1; 1 << j <= n; ++j )
for ( int i = 0; i + (1<<j) - 1 <= n; ++i )
{
int p1 = M[i][j-1];
int p2 = M[i+ (1<< j-1 ) ][j-1];
if ( A[p1] < A[p2] )
M[i][j] = p1;
else
M[i][j] = p2;
}
}
int Query(int i, int j)
{
int k = K[j-i+1];
int p1 = M[i][k];
int p2 = M[j - (1<<k) + 1 ][k];
if ( A[p1] < A[p2] )
return A[p1];
return A[p2];
}
void Preprocesare()
{
K.resize(n+1);
for ( int i = 2; i <= n; ++i )
K[i] = 1 + K[i/2];
}