Cod sursa(job #2514505)

Utilizator Rares31100Popa Rares Rares31100 Data 26 decembrie 2019 11:00:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <cmath>

using namespace std;

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

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

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 valMax=-1;
    
    while(a<=b)
    {
        if(a%2==1)
            valMax=max(valMax,tree[a]),a++;
            
        if(b%2==0)
            valMax=max(valMax,tree[b]),b--;
            
        a/=2,b/=2;
    }
    
    return valMax;
}

int main()
{
    cin>>n>>m;
    
    baza=pow( 2 , (int)log2(n)+(log2(n)>(int)log2(n)?1:0) );
    
    for(int i=baza;i<=baza+n-1;i++)
        cin>>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,k=1;k<=m;k++)
    {
        cin>>q>>a>>b;
        
        if(q==0)
            cout<<maxim(a,b)<<'\n';
        else
            update(a,b);
    }
    
    return 0;
}