Cod sursa(job #3042112)

Utilizator matei0000Neacsu Matei matei0000 Data 3 aprilie 2023 22:22:46
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

using namespace std;
int v[100005];
int aint[400005];
void build(int l, int r, int cr)
{
    if(l==r)
    {
        aint[cr]=v[l];
        return;
    }
    int mid=(l+r)/2;
    build(l,mid,cr*2);
    build(mid+1,r,cr*2+1);
    aint[cr]=max(aint[2*cr],aint[2*cr+1]);
}
void update(int l, int r, int val, int cr, int poz)
{
    if (l==r)
    {
        aint[cr]=val;
        return;
    }
    int mid=(l+r)/2;
    if (mid<poz)
        update(mid+1, r, val, 2*cr+1, poz);
    else
        update(l, mid, val, 2*cr, poz);
    aint[cr]=max(aint[2*cr], aint[2*cr+1]);
}
int query(int l, int r, int cr, int a, int b)
{
    if (a<=l&&r<=b)
        return aint[cr];
    int mid=(l+r)/2;
    if (mid>=b)
        return query(l, mid, 2*cr, a, b);
    if (mid<a)
        return query(mid+1, r, 2*cr+1, a, b);
    return max(query(l, mid, 2*cr, a, mid), query(mid+1, r, 2*cr+1, mid+1, b));
}
int main()
{
    ifstream cin ("arbint.in");
    ofstream cout ("arbint.out");
    ///4 3 5 6 1 (1-5)
    // 4 3 5 (1-3)   6 1 (4-5)
    // 4 3 (1-2)  5 (3-3)  6 (4-4)   1 (5-5)
    // 4    3
    int n, m, cer, a, b;
    cin>>n>>m;
    for (int i=1; i<=n; i++)
    {
        cin>>v[i];
    }
    build(1,n,1);
    for (int i=1; i<=m; i++)
    {
        cin>>cer>>a>>b;
        if (cer==0)
            cout<<query(1, n, 1, a, b)<<'\n';
        else
            update(1, n, b, 1, a);
    }
}