Cod sursa(job #3290871)

Utilizator alex_0747Gheorghica Alexandru alex_0747 Data 1 aprilie 2025 16:50:42
Problema Arbori de intervale Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 1.82 kb
class Arbore:
    def __init__(self, a = [], n = 0):
        self.aint = [0] * 4 * (n + 1)
        self.n = n
        self.Build(a, 1, 1, n)

    def Build(self, a, nod, st, dr):
        if nod >= len(self.aint):
            return
        if st == dr:
            self.aint[nod] = a[st]
            return
        mid = int((st + dr) / 2)
        self.Build(a, 2 * nod, st, mid)
        self.Build(a, 2 * nod + 1, mid + 1, dr)
        self.aint[nod] = max(self.aint[2 * nod], self.aint[2 * nod + 1])

    def Update(self, nod, st, dr, p, x):
        if st > p or dr < p:
            return
        if st == dr:
            self.aint[nod] = x
            return
        mid = int((st + dr) / 2)
        self.Update(2 * nod, st, mid, p, x)
        self.Update(2 * nod + 1, mid + 1, dr, p, x)
        self.aint[nod] = max(self.aint[2 * nod], self.aint[2 * nod + 1])

    def Query(self, nod, st, dr, l, r):
        if st > r or dr < l:
            return 0
        if l <= st and dr <= r:
            return self.aint[nod]
        mid = int((st + dr) / 2)
        q1 = self.Query(2 * nod, st, mid, l, r)
        q2 = self.Query(2 * nod + 1, mid + 1, dr, l, r)
        return max(q1, q2)
    
def main():
    f = open("arbint.in", "r")
    g = open("arbint.out", "w")
    s = f.readline()
    b = s.split()
    n = int(b[0])
    m = int(b[1])
    s = f.readline()
    b = s.split()
    a = [0]
    for i in b:
        a.append(int(i))
    arbint = Arbore(a, n)
    for i in range(m):
        s = f.readline()
        b = s.split()
        op = int(b[0])
        x = int(b[1])
        y = int(b[2])
        if op == 0:
            g.write(str(arbint.Query(1, 1, n, x, y)) + "\n")
        else:
            arbint.Update(1, 1, n, x, y)

    f.close()
    g.close()

if __name__ == '__main__':
    main()