Cod sursa(job #2823136)

Utilizator mateitudordmDumitru Matei mateitudordm Data 27 decembrie 2021 10:45:20
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <cmath>

using namespace std;

int aint[400001];
void update(int ind,int poz,int val,int st,int dr)
{
    if(st==dr)
        aint[ind]=val;
    else
    {
        if(poz<=(st+dr)/2)
            update(2*ind,poz,val,st,(st+dr)/2);
        else
            update(2*ind+1,poz,val,(st+dr)/2+1,dr);
        aint[ind]=max(aint[2*ind],aint[2*ind+1]);
    }
}
int query(int ind,int csta,int cdra,int cstq,int cdrq)
{
    if(csta>=cstq && cdra<=cdrq)
        return aint[ind];
    else
    {
        int aux=-10000000;
        if(cstq<=(csta+cdra)/2)
            aux=query(ind*2,csta,(csta+cdra)/2,cstq,cdrq);
        if(cdrq>(csta+cdra)/2)
            aux=max(aux,query(ind*2+1,(csta+cdra)/2+1,cdra,cstq,cdrq));
        return aux;
    }
}

int main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    int n,k,i,a,b,c,cn;
    cin>>n>>k;
    cn=n;
    for(i=1;i<=4*n;i++)
        aint[i]=0;
    n=(1<<int(ceil(double(log2(n)))));
    for(i=1; i<=cn; i++)
    {
        cin>>a;
        update(1,i,a,1,n);
    }
    for(i=1; i<=k; i++)
    {
        cin>>c>>a>>b;
        if(c==1)
            update(1,a,b,1,n);
        else
            cout<<query(1,1,n,a,b)<<'\n';
    }
    return 0;
}