Cod sursa(job #3271212)

Utilizator yellowGreenFatu Mihai yellowGreen Data 25 ianuarie 2025 14:04:05
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
using namespace std;
int n,q,A[100005],aint[400005];
void build(int node,int st,int dr)
{
    if(st==dr)
    {
        aint[node]=A[st];
        return;
    }
    int mij=(st+dr)>>1;
    build(2*node,st,mij);
    build(2*node+1,mij+1,dr);
    aint[node]=max(aint[2*node],aint[2*node+1]);
}
void update(int val,int pos,int node,int st,int dr)
{
    if(st==dr)
    {
        aint[node]=val;
        return;
    }
    int mij=(st+dr)>>1;
    if(pos<=mij)
        update(val,pos,2*node,st,mij);
    else
        update(val,pos,2*node+1,mij+1,dr);
    aint[node]=max(aint[2*node],aint[2*node+1]);
}
int query(int x,int y,int node,int st,int dr)
{
    if(x>dr || y<st)
        return -1;
    if(st>=x && dr<=y)
        return aint[node];
    int mij=(st+dr)>>1;
    int left=query(x,y,2*node,st,mij);
    int right=query(x,y,2*node+1,mij+1,dr);
    return max(left,right);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
        cin>>A[i];
    build(1,1,n);
    while(q--)
    {
        int op,x,y;
        cin>>op>>x>>y;
        if(op==1)
            update(y,x,1,1,n);
        else
            cout<<query(x,y,1,1,n)<<"\n";
    }
    return 0;
}