Cod sursa(job #2678788)

Utilizator Joke2111Pricop Tudor Joke2111 Data 28 noiembrie 2020 17:59:47
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>

using namespace std;

int Arbore[400005], V[100005];
int x,y,n,m;
bool op;

void fast ()
{
    ios_base::sync_with_stdio(false);
    cin.tie();
}

void update (int pozitie, int valoare, int nodcurent=1, int capatST=1, int capatDR=n)
{
    if (capatST==capatDR)
    {
        Arbore[nodcurent]=valoare;
        return;
    }

    int mid = (capatST+capatDR)/2;

    if (pozitie <= mid)
    {
        update (pozitie, valoare, nodcurent *2, capatST, mid);
    }
    else
    {
        update (pozitie, valoare, nodcurent *2+1, mid+1, capatDR);
    }

    Arbore[nodcurent]= max (Arbore[nodcurent *2],Arbore[nodcurent *2+1]);
}

int query (int queryST, int queryDR, int nodcurent=1, int capatST=1, int capatDR=n)
{

    if (queryST==capatST && queryDR==capatDR)
    {
        return Arbore[nodcurent];
    }

    int mid = (capatST+capatDR)/2;

    if (queryDR<=mid)
    {
        return query (queryST, queryDR, nodcurent *2, capatST, mid);
    }
    else if (mid+1<=queryST)
    {
        return query (queryST, queryDR, nodcurent *2+1, mid+1, capatDR);
    }
    else
    {
        int a= query (queryST, mid, nodcurent *2, capatST, mid);
        int b= query (mid+1, queryDR, nodcurent *2+1, mid+1, capatDR);
        return max (a,b);
    }
}

int main()
{
    fast();
    freopen("arbint.in","r", stdin);
    freopen("arbint.out","w", stdout);

    cin >> n >> m;
    for (int i=1; i<=n; i++)
    {
        cin >> V[i];
        update (i,V[i]);
    }

    for (int i=1; i<=m; i++)
    {
        cin >> op >> x >> y;
        if (op==1)
            update (x,y);
        if (op==0)
            cout << query (x,y) << '\n';
    }

    return 0;
}