Cod sursa(job #2979904)

Utilizator RobertlelRobert Robertlel Data 16 februarie 2023 08:42:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f ("arbint.in");
ofstream g ("arbint.out");

int v[500005] , n , m , x , i , maxim , y , z;

void update (int nod , int left , int right , int poz , int val)
{
    if (left == right)
    {
        v[nod] = val;
        return;
    }
    int mij = (left + right) / 2;
    if (poz <= mij)
        update (2 * nod , left , mij , poz , val);
    else
        update (2 * nod + 1 , mij + 1 , right , poz , val);
    v[nod] = max (v[2 * nod] , v[2 * nod + 1]);
}

void querry (int nod , int left , int right , int ql , int qr , int &maxim)
{
    if (ql <= left && qr >= right)
    {
        maxim = max (maxim , v[nod]);
        return;
    }
    int mij = (left + right) / 2;
      if (ql <= mij)
        querry (2 * nod , left , mij , ql , qr , maxim);
      if (qr > mij)
        querry (2 * nod + 1 , mij + 1 , right , ql , qr , maxim);
}

int main()
{
    f >> n >> m;
    for (int i = 1 ; i <= n ; i++)
    {
        f >> x;
        update (1 , 1 , n , i , x);
    }
    for (int i = 1 ; i <= m ; i++)
    {
        f >> x >> y >> z;
        if (x == 0)
           {
               int maxim = 0;
               querry (1 , 1 , n , y , z , maxim);
               g << maxim << '\n';;
           }
        else
            update (1 , 1 , n , y , z);
    }
    return 0;
}