Cod sursa(job #3200311)

Utilizator GoreaRaresGorea Rares-Andrei GoreaRares Data 4 februarie 2024 12:28:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>

using namespace std;

int v[100001], aint[400001], maxi;

void build(int nod, int st, int dr)
{
   if(st == dr)
   {
      aint[nod] = v[st];
   }
   else
   {
      int mij = (st + dr) / 2;
      build(2 * nod, st, mij);
      build(2 * nod + 1, mij + 1, dr);
      aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
   }
}

void update(int nod, int st, int dr, int a, int b)
{
   if(st == dr)
   {
      aint[nod] = b;
   }
   else
   {
      int mij = (st + dr) / 2;
      if(a <= mij)
      {
         update(2 * nod, st, mij, a, b);
      }
      else
      {
         update(2 * nod + 1, mij + 1, dr, a, b);
      }
      aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
   }
}

void query(int nod, int st, int dr, int a, int b)
{
   if(a <= st && dr <= b)
   {
      maxi = max(maxi, aint[nod]);
   }
   else
   {
      int mij = (st + dr) / 2;
      if(a <= mij)
      {
         query(2 * nod, st, mij, a, b);
      }
      if(b > mij)
      {
         query(2 * nod + 1, mij + 1, dr, a, b);
      }
   }
}

int main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    int n, m, i, t, a, b;
    cin >> n >> m;
    for(i = 1; i <= n; i++)
    {
       cin >> v[i];
    }
    build(1, 1, n);
    for(i = 1; i <= m; i++)
    {
       cin >> t >> a >> b;
       if(t == 0)
       {
          maxi = -1e9;
          query(1, 1, n, a, b);
          cout << maxi << "\n";
       }
       else
       {
          update(1, 1, n, a, b);
       }
    }
    return 0;
}