Cod sursa(job #1768661)

Utilizator nurof3nCioc Alex-Andrei nurof3n Data 1 octombrie 2016 12:10:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("rmq.in");
ofstream g ("rmq.out");
const int MAXN = 100001;
const int LOGMAXN = 18;
int N, M, v[MAXN], RMQ[MAXN][LOGMAXN], lg[MAXN];
///LG[i] ESTE LOG(i)
int main()
{
    f >> N >> M;
    lg[1]=0;
    for (int i = 2; i <= N; i++)
        lg[i] = lg[i/2] + 1;
    for (int i = 1; i <= N; i++)
        f >> v[i];
    for (int i = 0; i <= N; i++)
        RMQ[i][0] = i;
    for (int j = 1; (1 << j) <= N; j++)
        for (int i = 0; i + (1 << j) - 1 <= N; i++)
            if (v[RMQ[i][j - 1]] <= v[RMQ[i + (1 << (j - 1) ) ][j - 1]])
                RMQ[i][j] = RMQ[i][j - 1];
            else
                RMQ[i][j] = RMQ[i + (1 << (j - 1) ) ][j - 1];
    for (int i = 1; i <= M; i++)
    {
        int x, y, rasp;
        f >> x >> y;
        int log = lg[y-x+1];
        rasp = min (v[RMQ[x][log]], v[RMQ[y- (1<<log) +1][log]]);
        g << rasp << '\n';
    }
    return 0;
}