Cod sursa(job #2556437)

Utilizator Rares31100Popa Rares Rares31100 Data 24 februarie 2020 21:36:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,baza,C;
int tree[270000];

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 maxim(int a,int b)
{
    a+=baza-1;
    b+=baza-1;
    int maxim=0;

    while(a<=b)
    {
        if(a%2==1)
            maxim=max(maxim,tree[a]),a++;

        if(b%2==0)
            maxim=max(maxim,tree[b]),b--;

        a/=2,b/=2;
    }

    return maxim;
}

int main()
{
    in>>n>>C;
    baza=pow( 2, (int)log2(n)+ ( log2(n)>(int)log2(n) ? 1 : 0 ) )+0.5;

    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 q,a,b,i=1;i<=C;i++)
    {
        in>>q>>a>>b;

        if(q==1)
            update(a,b);
        else
            out<<maxim(a,b)<<'\n';
    }

    return 0;
}