Pagini recente » Cod sursa (job #809551) | Cod sursa (job #1392665) | Cod sursa (job #593443) | Cod sursa (job #918722) | Cod sursa (job #1841955)
#include <cstdio>
using namespace std;
FILE *f, *g;
inline int mna(int a, int b)
{
return (a < b ? a : b);
}
int rmq[100002][18];
int v[100002];
int p2Max[100002];
int n, q;
void readFile()
{
f = fopen("rmq.in", "r");
fscanf(f, "%d%d", &n, &q);
int i;
for(i = 1; i <= n; i ++)
fscanf(f, "%d", &v[i]);
}
void getPowers2()
{
int i;
p2Max[1] = 0;
for(i = 2; i <= n; i ++)
p2Max[i] = p2Max[i / 2] + 1;
}
void getRMQ()
{
int i, j, p2;
for(i = 1; i <= n; i ++)
rmq[i][0] = v[i];
for(j = 1; (1 << j) <= n; j ++)
{
for(i = 1; i <= n - (1 << j) + 1; i ++)
{
p2 = 1 << (j - 1);
rmq[i][j] = mna(rmq[i][j - 1], rmq[i + p2][j - 1]);
}
}
}
void solve()
{
getPowers2();
getRMQ();
}
void answerQuestions()
{
g = fopen("rmq.out", "w");
int i, p2, diff, right, st, dr;
for(i = 1; i <= q; i ++)
{
fscanf(f, "%d%d", &st, &dr);
diff = dr - st + 1;
p2 = p2Max[diff];
right = diff - (1 << p2);
fprintf(g, "%d\n", mna(rmq[st][p2], rmq[st + right][p2]));
}
fclose(f);
fclose(g);
}
int main()
{
readFile();
solve();
answerQuestions();
return 0;
}