Cod sursa(job #2979063)

Utilizator CobzaruAntonioCobzaru Paul-Antonio CobzaruAntonio Data 14 februarie 2023 19:10:58
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>

using namespace std;
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
int n,m;
int h[400005];
void actualizare (int st,int dr,int vf,int pozst,int pozdr,int val)
{
    if (pozst==st && dr==pozdr)
    {
        h[vf] = val;
        return;
    }
    int nval = -1;
    int mij = (st+dr)/2;
    if (pozst <= mij)
        actualizare(st,mij,2*vf,pozst,pozdr,val);
    if (pozdr>mij)
        actualizare(mij+1,dr,2*vf+1,pozst,pozdr,val);
    nval = max(nval,h[2*vf]);
    nval = max(nval,h[2*vf+1]);
    h[vf] = nval;
}
int intreaba (int st,int dr,int vf,int pozst,int pozdr)
{
    if (pozst<=st && dr<=pozdr)
        return h[vf];
    int nval = -1;
    int mij = (st+dr)/2;
    if (pozst <= mij)
        nval = max(nval,intreaba(st,mij,2*vf,pozst,pozdr));
    if (pozdr>mij)
        nval = max(nval,intreaba(mij+1,dr,2*vf+1,pozst,pozdr));
    return nval;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int i,j;
    cin >> n >> m;
    for (i=1;i<=n;i++)
    {
        int x;
        cin >> x;
        actualizare(1,n,1,i,i,x);
    }
    for (i=1;i<=m;i++)
    {
        int t,x,y;
        cin >> t >> x >> y;
        if (t == 0)
            cout << intreaba(1,n,1,x,y) << '\n';
        else
            actualizare(1,n,1,x,x,y);
    }
    return 0;
}