Pagini recente » Cod sursa (job #2571209) | Cod sursa (job #1532137) | Cod sursa (job #131155) | Cod sursa (job #2090389) | Cod sursa (job #2055621)
#include <iostream>
#include <stdio.h>
#define MAXN 100000 + 2
using namespace std;
int N, M;
int RMQ[17][MAXN]; //2^16<=MAXN.
int Lg[MAXN]; //Lg[ i ] = K, 2^K<=i;
FILE *f, *g;
int main()
{
f = fopen("rmq.in", "r");
g = fopen("rmq.out", "w");
fscanf(f, "%d %d", &N, &M);
for (int i = 1; i <= N; i++)
fscanf(f, "%d", &RMQ[ 0 ][ i ]);
//Compute Lg.
Lg[1] = 0;
for (int i = 2; i <= N; i++)
Lg[i] = Lg[ i / 2 ] + 1;
//RMQ array.
for (int i = 1; (1 << i) <= N; i++)
for (int j = 1; j <= N - (1 << i) + 1; j++)
RMQ[ i ][ j ] = std::min(RMQ[ i - 1 ][ j ], RMQ[ i - 1 ][ j + (1 << (i - 1)) ]);
for (int i = 1, X, Y; i <= M; i++)
{
fscanf(f, "%d %d", &X, &Y);
int Length = Y - X + 1;
int K = Lg[ Length ]; //2^K<=Length, K maximum.
int Answer = std::min(RMQ[ K ][ X ], RMQ[ K ][ Y - (1 << K) + 1 ]);
fprintf(g, "%d\n", Answer);
}
fclose(f);
fclose(g);
return 0;
}