Pagini recente » Monitorul de evaluare | Cod sursa (job #808549) | Profil M@2Te4i | Profil Shakye | Cod sursa (job #2010597)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("rmq.in");
ofstream out ("rmq.out");
int const nmax = 100000;
int n;
int v[1 + nmax];
int rmq[20][nmax];
int lg[1 + nmax];
void computermq(){
for(int i = 1; i < n ;i++){
if(v[i] < v[i + 1])
rmq[0][i] = v[i];
else
rmq[0][i] = v[i + 1];
}
for(int i = 1 ; i <= 20 ;i++){
int lim = n - (1 << i);
for(int j = 1 ; j <= lim ;j++){
if(rmq[i - 1][j] < rmq[i - 1][j + (1 << (i - 1) )])
rmq[i][j] = rmq[i - 1][j];
else
rmq[i][j] = rmq[i - 1][j + (1 << (i - 1) )];
}
}
}
int main()
{
int q;
in>>n>>q;
for(int i = 1 ; i <= n ;i++){
in>>v[i];
if(1 < i)
lg[i] = lg[(i >> 1) ] + 1;
}
int x , y;
computermq();
for(int i = 0 ; i < q ;i++){
in>>x>>y;
if(x == y)
out<<v[x]<<'\n';
else {
out<<min(rmq[lg[y - x]][x], rmq[lg[y - x]][y - (1 << lg[y - x ]) ] )<<'\n';
}
}
return 0;
}