Cod sursa(job #2646065)

Utilizator Rares31100Popa Rares Rares31100 Data 30 august 2020 18:11:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

int n, m, baza, tree[262145];

void update(int poz, int val)
{
    poz += baza-1;
    
    tree[poz] = val;
    poz /= 2;
    while(poz)
    {
        tree[poz] = max(tree[poz*2], tree[poz*2+1]);
        poz /= 2;
    }
}

int query(int st, int dr)
{
    st += baza-1;
    dr += baza-1;
    
    int maxim = 0;
    
    while(st <= dr)
    {
        if(st%2 == 1)
            maxim = max(maxim, tree[st++]);
        
        if(dr%2 == 0)
            maxim = max(maxim, tree[dr--]);
            
        st /= 2; dr /= 2;
    }
    
    return maxim;
}

int main()
{
    in >> n >> m;
    baza = 1 << (int)ceil( log2(n) );
    
    for(int i = baza; i <= baza+n-1; i++)
        in >> tree[i];
        
    for(int k = baza/2; k != 0; k /= 2)
        for(int i = k; i <= k*2-1; i++)
            tree[i] = max(tree[i*2], tree[i*2+1]);
            
    for(int i = 1, c, a, b; i <= m; i++)
    {
        in >> c >> a >> b;
        
        if(c == 0)
            out << query(a,b) << '\n';
        else
            update(a,b);
    }
    
    return 0;
}