Cod sursa(job #3230866)

Utilizator irina_opreaIrina Oprea irina_oprea Data 23 mai 2024 09:34:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>

using namespace std;

int aint[1000000], poz=0, val=0, a, b, maxx=0;

void update(int, int, int);
void search_aint(int, int, int);

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

    int n, k, op, nr;
    cin >> n >> k;
    for (int i=0; i<n; i++)
    {
        cin >> nr;
        poz = i+1;
        val = nr;
        update(1, 1, n);
    }
    for (int i=0; i<k; i++)
    {
        cin >> op >> a >> b;
        if (op == 0)
        {
            maxx = 0;
            search_aint(1, 1, n);
            cout << maxx << endl;
        }
        else
        {
            poz = a;
            val = b;
            update(1, 1, n);
        }
    }
    return 0;
}

void update(int nod, int st, int dr)
{
    if (st == dr)   /// bottom of the tree (coroana)
    {
        aint[nod] = val;
        return;
    }

    int mid = (st + dr) / 2;    /// delimitarea intervalelor
    if (poz <= mid)
    {
        update(2*nod, st, mid);
    }
    else
    {
        update((2*nod)+1, mid+1, dr);
    }

    aint[nod] = max (aint[2*nod], aint[2*nod+1]);  /// care e cel mai mare din interval (verifici ce are sub)
}

void search_aint(int nod, int st, int dr)
{
    if ((a <= st) && (dr <= b))  // ?
    {
        if (aint[nod] > maxx)
        {
            maxx = aint[nod];
        }
        return;
    }

    int mid = (st + dr) / 2;
    if (a <= mid)
    {
        search_aint(2*nod, st, mid);
    }
    if (mid < b)
    {
        search_aint(2*nod+1, mid+1, dr);
    }
}
/**

              1(1-5)
       2(1-3)       3(4-5)
   4(1-2)   5(3)  6(4)    7(5)
 8(1)  9(2)

5 5
4 3 5 6 1
**/