Cod sursa(job #2449224)

Utilizator voyagerSachelarie Bogdan voyager Data 18 august 2019 19:57:31
Problema Range minimum query Scor 30
Compilator py Status done
Runda Arhiva educationala Marime 0.83 kb
#!/usr/bin/env python3

import sys

sys.stdout = open('rmq.out', 'w')

with open('rmq.in', 'r') as f:
    readInts = lambda: map(int, f.readline().split())

    N, M = tuple(readInts())
    A = [int(f.readline()) for _ in range(N)]
    LOG = 0
    while 1 << (LOG + 1) < N: LOG += 1
    RMQ = [[i] * (LOG + 1) for i in range(N)]

    for j in range(1, LOG + 1):
        for i in range(N):
            jPow = 1 << (j - 1)
            if i + jPow * 2 > N: break
            RMQ[i][j] = RMQ[i][j - 1] if A[RMQ[i][j-1]] < A[RMQ[i + jPow][j-1]] else RMQ[i + jPow][j - 1]
    
    def findMin(l, r):
        logDiff = 0
        while 1 << (logDiff + 1) < r - l + 1: logDiff += 1
        return min(A[RMQ[l][logDiff]], A[RMQ[r - (1 << logDiff) + 1][logDiff]])

    for _ in range(M):
        l, r = tuple(readInts())
        print(findMin(l - 1, r - 1))