Pagini recente » Cod sursa (job #1221852) | Cod sursa (job #1545859) | Cod sursa (job #2191944) | Cod sursa (job #1386879) | Cod sursa (job #1834139)
#include <fstream>
const int NMAX = 100005;
const int LGMAX = 21;
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n,q,m,A[NMAX],M[NMAX][LGMAX],x,y,dif,Log[NMAX];
void preprocess()
{
for (int i = 1; i <= n; ++i)
{
M[i][0] = i;
}
for (int j = 1; (1<<j) <= n; ++j)
{
for (int i = 1; i+(1<<j)-1 <= n; ++i)
{
if (A[ M[i][j-1] ] < A[ M[i + (1<<(j-1))][j-1] ])
M[i][j] = M[i][j-1];
else M[i][j] = M[i + (1<<(j-1))][j-1];
}
}
}
void logaritmi()
{
Log[1] = 0;
for (int i = 2; i <= n; ++i) //precalculare Logaritmi
{
Log[i]=Log[i/2]+1;
}
}
int main()
{
f >> n >> q;
for (int i = 1; i <= n; ++i)
{
f >> A[i];
}
logaritmi();
preprocess();
for (int i = 1; i <= q; ++i)
{
f >> x >> y;
dif = y - x + 1;
int Lg = Log[dif];
if (A[ M[x][Lg] ] < A[ M[y-(1<<Lg)+1][Lg] ])
g << A[ M[x][Lg] ] << '\n';
else g << A[ M[y-(1<<Lg)+1][Lg] ] << '\n';
}
f.close();
g.close();
return 0;
}