Cod sursa(job #2658764)

Utilizator Rares31100Popa Rares Rares31100 Data 14 octombrie 2020 23:28:57
Problema Arbori de intervale Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 1.45 kb
import math
fin = open("arbint.in", "r")
sir = fin.read()
sir += "##"

def readNum():
    x = 0
    
    if sir[readNum.point] == "#":
        return 0
    
    while(sir[readNum.point] >= '0' and sir[readNum.point] <= '9'):
        x = x * 10 + int(sir[readNum.point])
        readNum.point += 1;
        
    readNum.point += 1;
    return x
    
    
readNum.point = 0;
n = readNum()
m = readNum()
vect = []

for i in range(n):
    nr = readNum()
    vect.append(nr)

tree = [0]*262144
baza = 1 << int(math.ceil(math.log2(n)))

for i in range(n):
    tree[baza+i] = vect[i];
    
for k in range(int(math.log2(baza))-1, -1, -1):
    for i in range(1<<k, 1<<k+1):
        tree[i] = max(tree[i*2], tree[i*2+1])

def update(poz, val):
    poz += baza-1
    tree[poz] = val
    poz //= 2
    
    while poz > 0:
        tree[poz] = max(tree[poz*2], tree[poz*2+1])
        poz //= 2 
    
    
def query(a, b):
    a += baza-1
    b += baza-1
    rez = 0
    
    while a <= b:
        if a % 2 == 1:
            rez = max(rez, tree[a])
            a += 1
        
        if b % 2 == 0:
            rez = max(rez, tree[b])
            b -= 1
        
        a //= 2 
        b //= 2
    
    return rez


fout = open("arbint.out", "w")

while m > 0:
    m -= 1 
    c = readNum()
    a = readNum()
    b = readNum()
    
    if c == 0:
        fout.write(str(query(a, b))+"\n")
    else:
        update(a, b)