Pagini recente » Cod sursa (job #2524906) | Cod sursa (job #1494479) | Cod sursa (job #2466528) | Cod sursa (job #1649253) | Cod sursa (job #1650202)
#include <iostream>
#include <fstream>
#define nmax 100001
using namespace std;
int n, m, i, j;
int EXP[nmax];
int RMQ[18][nmax];
int main()
{
ifstream fi("rmq.in");
ofstream fo("rmq.out");
// Care este elementul minim din intervalul [x, y]?
fi >> n >> m;
for (i = 1; i <= n; i++)
fi >> RMQ[0][i];
EXP[1] = 0;
for(i = 2; i <= n; i++)
EXP[i] = EXP[i/2] + 1;
for (i = 1; i <= EXP[n]; i++)
for (int j = 1; j <= n - (1<<i) + 1; j++)
{
int st = j;
int dr = st + (1<<i) - 1;
int mid = dr - (1<<(i-1)) + 1;
RMQ[i][j] = min(RMQ[i-1][st], RMQ[i-1][mid]);
}
for (i = 1; i <= m; i++)
{
int x, y;
fi >> x >> y;
int len = y - x + 1;
int k = EXP[len];
int rez = RMQ[k][x];
rez = min(rez, RMQ[k][y-(1<<k)+1]);
fo << rez << "\n";
}
fi.close();
fo.close();
return 0;
}