Pagini recente » Istoria paginii runda/simulare_oji_2023_clasa_9_16_martie/clasament | Cod sursa (job #2600468) | Rating alexandra g (alegal2100) | Cod sursa (job #749162) | Cod sursa (job #2055647)
#include <iostream>
#include <stdio.h>
#define MAXN 100000 + 2
using namespace std;
int N, M;
int Array[MAXN];
FILE *f, *g;
class RangeMinimumQuery
{
private:
int RMQ[17][MAXN];
int Lg[MAXN];
public:
RangeMinimumQuery(int *V, int N)
{
for (int i = 1; i <= N; i++)
this->RMQ[ 0 ][ i ] = *(V + i);
//RMQ array.
for (int i = 1; (1 << i) <= N; i++)
for (int j = 1; j <= N - (1 << i) + 1; j++)
this->RMQ[ i ][ j ] = std::min(this->RMQ[ i - 1 ][ j ], this->RMQ[ i - 1 ][ j + (1 << (i - 1)) ]);
//Compute Lg.
this->Lg[1] = 0;
for (int i = 2; i <= N; i++)
this->Lg[i] = this->Lg[ (i >> 1) ] + 1;
}
~RangeMinimumQuery()
{
}
public:
int Query(int X, int Y)
{
int Length = Y - X + 1;
int K = this->Lg[ Length ];
return std::min(this->RMQ[ K ][ X ], this->RMQ[ K ][ Y - (1 << K) + 1 ]);
}
};
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", &Array[ i ]);
RangeMinimumQuery *RMQ = new RangeMinimumQuery(Array, N);
for (int i = 1, X, Y; i <= M; i++)
fscanf(f, "%d %d", &X, &Y),
fprintf(g, "%d\n", RMQ->Query(X, Y));
fclose(f);
fclose(g);
return 0;
}