Pagini recente » Cod sursa (job #396344) | Cod sursa (job #1519964) | Cod sursa (job #2453566) | Cod sursa (job #2945914) | Cod sursa (job #1983890)
// Borcani Robert Raul
/* Folosesc un sir M[i] = pozitia min( a[i*sqrt(N)], a[i*sqrt(N) + 1], ... a[(i + 1)*sqrt(n) - 1]
* Complexitate : - timp : O(N*sqrt(N))
* - memorie : o(N)
* */
#include <fstream>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, Q;
vector<int> a, M;
int n; // = sqrt(N);
void Read();
void Precalculate();
void AnswerQuery( int x, int y );
int main()
{
Read();
Precalculate();
int x, y;
while ( Q-- )
{
fin >> x >> y;
AnswerQuery(x - 1, y - 1);
}
fin.close();
fout.close();
return 0;
}
void Read()
{
int x;
fin >> N >> Q;
for ( int i = 1; i <= N; ++i )
{
fin >> x;
a.push_back(x);
}
}
void Precalculate()
{
n = sqrt(N);
int i, j;
for ( i = 0; i*n < N; ++i )
{
int minim{a[i*n]}, p = i*n;
for ( j = i*n + 1; j < (i + 1)*n && j < N; ++j )
if ( a[j] < minim )
{
minim = a[j];
p = j;
}
M.push_back(p);
//fout << p << ' ';
}
}
void AnswerQuery( int x, int y )
{
int r{a[x]};
while ( x % n != 0 && x <= y )
{
r = min( r, a[x] );
++x;
}
while ( x + n - 1 <= y )
{
r = min( r, a[M[x / n]] );
x += n;
}
while ( x <= y )
{
r = min( r, a[x] );
++x;
}
fout << r << '\n';
}