Cod sursa(job #2602724)

Utilizator lev.tempfliTempfli Levente lev.tempfli Data 17 aprilie 2020 18:10:44
Problema Range minimum query Scor 30
Compilator py Status done
Runda Arhiva educationala Marime 1.05 kb
import math


def input_get_int(fname):
    with open(fname, 'rt') as fin:
        for line in fin:
            for val in line.split():
                yield int(val)


class Range_minimum_query:
    lookup = []

    def __init__(self, arr):
        self.lookup = [[0 for _ in range(int(math.log2(len(arr)) + 1))] for _ in range(len(arr))]
        for i in range(len(arr)):
            self.lookup[i][0] = arr[i]
        for j in range(1, len(self.lookup[0])):
            for i in range(len(self.lookup) - (1 << j) + 1):
                self.lookup[i][j] = min(self.lookup[i][j - 1], self.lookup[i + (1 << j) // 2][j - 1])

    def query(self, i, j):
        lg = int(math.log2(j - i + 1))
        return min(self.lookup[i][lg], self.lookup[j - (1 << lg) + 1][lg])


if __name__ == "__main__":
    ig = input_get_int("rmq.in")
    n, m = next(ig), next(ig)
    a = [next(ig) for _ in range(n)]
    rmq = Range_minimum_query(a)

    with open("rmq.out", 'wt') as fout:
        for _ in range(m):
            fout.write('{}\n'.format(rmq.query(next(ig) - 1, next(ig) - 1)))