Cod sursa(job #2882527)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 31 martie 2022 15:23:42
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

int n,v[400005],aint[400005];

void update(int st,int dr, int val, int nod, int poz)
{
    if(st==dr)
    {
        aint[nod]=val;
        return;
    }
    if((st+dr)/2<poz)
    {
        update((st+dr)/2+1,dr,val,nod*2+1,poz);
        aint[nod]=max(aint[2*nod],aint[2*nod+1]);
    }
    else
    {
        update(st,(st+dr)/2,val,nod*2,poz);
        aint[nod]=max(aint[2*nod],aint[2*nod+1]);
    }
}

int querry(int st_q,int dr_q, int st, int dr, int nod)
{
    if(st_q<=st&&dr_q>=dr)
    {
        return aint[nod];
    }
    int m=0;
    if(st_q<=(st+dr)/2)
    {
        m=max(m,querry(st_q,dr_q,st,(st+dr)/2,nod*2));
    }
    if(dr_q>(st+dr)/2)
    {
        m=max(m,querry(st_q,dr_q,(st+dr)/2+1,dr,nod*2+1));
    }
    return m;
}

int main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    int m;
    cin>>n>>m;
    int p=1;

    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
    }
    while(p<n)
    {
        p=p*2;
    }
    n=p;
    for(int i=1;i<=n;i++)
    {
        update(1,n,v[i],1,i);
    }
    int t,a,b;
    for(int i=1;i<=m;i++)
    {
        cin>>t>>a>>b;
        if(t==1)
        {
            update(1,n,b,1,a);
        }
        else
        {
            cout<<querry(a,b,1,n,1)<<"\n";
        }
    }
    return 0;
}