Cod sursa(job #2658766)

Utilizator Rares31100Popa Rares Rares31100 Data 14 octombrie 2020 23:30:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m;
int baza, tree[262144];
 
int query(int a, int b)
{
    a += baza-1;
    b += baza-1;
    int rez = 0;
 
    while(a<=b)
    {
        if(a%2 == 1)
        {
            rez = max(rez, tree[a]);
            a++;
        }
 
        if(b%2 == 0)
        {
            rez = max(rez, tree[b]);
            b--;
        }
 
        a /= 2;
        b /= 2;
    }
 
    return rez;
}
 
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 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; k/=2)
        for(int i = k; i <= k*2-1; i++)
            tree[i] = max(tree[i*2], tree[i*2+1]);
 
    for(int c, a, b; m; m--)
    {
        in >> c >> a >> b;
 
        if(c == 0)
            out << query(a, b) << '\n';
        else
            update(a, b);
    }
 
    return 0;
}