Pagini recente » Cod sursa (job #3256527) | Cod sursa (job #652532) | Cod sursa (job #1642171) | Cod sursa (job #1531795) | Cod sursa (job #1512446)
#include <fstream>
using namespace std;
const int N = 100000, L = 17;
ifstream in("rmq.in");
ofstream out("rmq.out");
int v[1 + N], log[1 + N], r[1 + N][L], n, q;
int min(int x, int y)
{
return x < y ? x : y;
}
void citireVector()
{
in >> n >> q;
for (int i = 1; i <= n; i++)
in >> v[i];
}
void calculLog()
{
int i, vlog = 0;
for (i = 1; i <= n; i++)
{
if (i >= (1 << vlog)) vlog++;
log[i] = vlog - 1;
}
}
void constructieMatrice()
{
for (int i = 1; i <= n; i++)
{
r[i][0] = v[i];
for (int j = 1; 1 << j <= i; j++)
r[i][j] = min(r[i][j - 1], r[i - (1 << (j - 1))][j - 1]);
}
}
int raspuns(int a, int b)
{
int lung = log[b - a + 1];
return min(r[a + (1 << lung) - 1][lung], r[b][lung]);
}
void raspundeIntrebari()
{
int a, b, i;
for (i = 1; i <= q; i++)
{
in >> a >> b;
out << raspuns(a, b) << "\n";
}
in.close();
out.close();
}
int main()
{
citireVector();
calculLog();
constructieMatrice();
raspundeIntrebari();
return 0;
}