Cod sursa(job #2836119)

Utilizator AndreiCroitoruAndrei Croitoru AndreiCroitoru Data 19 ianuarie 2022 19:38:08
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

int maxim;
int aint[400001];
void update(int nod, int val ,int a, int b, int poz)
{
    if ( a == b ) /// e egal si cu poz
    {
        aint[nod] = val;
        return;
    }
    int mij = (a + b) >> 1;
    if( poz <= mij )
    {
        update(2 * nod, val, a, mij , poz);
    }
    if(poz > mij)
        update(2 * nod + 1, val, mij + 1, b, poz);
    aint[nod] = max( aint[2 * nod], aint[2 * nod + 1]);
}

void query(int nod, int a, int b, int wa, int wb)
{
    if(a >= wa and b <= wb)
    {
        maxim = max(maxim, aint[nod]);
    }
    else
    {
        int mij = (a + b) >> 1;
        if (wa <= mij)
            query(2 * nod, a, mij, wa, wb);
        if(wb > mij)
            query(2 * nod + 1, mij + 1, b, wa, wb);
    }
}

int v[100001];
int main()
{

    ifstream cin("arbint.in");
    ofstream cout("arbint.out");

    int n, t;
    cin >> n >> t;
    for ( int i = 1; i <= n; i ++)
    {
        cin >> v[i];
        update(1, v[i], 1, n, i);
    }
    while ( t-- )
    {
        int q, a, b;
        cin >> q >> a >> b;
        if (q == 1)
        {
            update(1, b, 1, n, a);
        }
        else
        {
            maxim  = 0;
            query(1,1,n,a,b);
            cout << maxim << '\n';
        }
    }
    return 0;
}