Cod sursa(job #2884376)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 3 aprilie 2022 02:34:51
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

long long v[200005],aint[400005],n;

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


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

int main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    long long m;
    cin>>n>>m;
    for(long long i=1; i<=n; i++)
    {
        cin>>v[i];
    }
    int put=1;
    while(put<n)
    {
        put=put*2;
    }
    n=put;
    for(int i=1;i<=n;i++)
    {
        update(1,n,1,i,v[i]);
    }
    long long t,a,b;
    for(long long i=1; i<=m; i++)
    {
        cin>>t>>a>>b;
        if(t==1)
        {
            update(1,n,1,a,b);
        }
        else
        {
            if(t==0)
            {
                cout<<querry1(1,n,1,a,b)<<"\n";
            }
        }
    }
    return 0;
}