Cod sursa(job #2639949)

Utilizator GiosinioGeorge Giosan Giosinio Data 4 august 2020 16:05:09
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
/*https://www.topcoder.com/community/competitive-programming/tutorials/range-minimum-query-and-lowest-common-ancestor/*/
#include <iostream>
#include <fstream>
#include <math.h>
#define MAX 100005
#define logMax 16

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int A[MAX], N, logN;
int M[MAX+1][logMax+1];
int Q; // Q = M(din cerinta = nr de intrebari = queries)

void read(int &N, int &Q, int v[]){
    f>>N>>Q;
    for(int i=1; i<=N; i++)
        f>>v[i];
}

void preprocessing(int M[][logMax+1]){
    for(int i=1; i<=N; i++)
        M[i][0] = i;
    for(int j=1; 1 << j <=N; j++)
        for(int i=0; i + (1<<j) - 1 <=N; i++)
            if(A[M[i][j-1]] < A[M[i + (1 << (j-1))][j-1]])
                M[i][j] = M[i][j-1];
            else
                M[i][j] = M[i + (1 << (j-1))][j-1];
}

int Query(int i, int j){
    int k = int(log2(j-i+1));
    if(A[M[i][k]] < A[M[j-(1<<k)+1][k]])
        return A[M[i][k]];
    else
        return A[M[j-(1<<k)+1][k]];
}

int main()
{
    read(N,Q,A);
    logN = int(log2(N));
    preprocessing(M);
    int x,y;
    for(int i=1; i<=Q; i++){
        f>>x>>y;
        g<<Query(x,y)<<"\n";
    }
}