Cod sursa(job #2887279)

Utilizator petru-robuRobu Petru petru-robu Data 9 aprilie 2022 11:03:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
#define N 100002
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m, A[N], aint[2*N], res=-1;

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

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

void query(int nod, int st, int dr, int stq, int drq)
{
  if(st>=stq && dr<=drq)
  {
    res=max(res, aint[nod]);
    return;
  }
  int m = (st+dr)/2;
  if(stq<=m)
    query(2*nod, st, m, stq, drq);
  if(drq>m)
    query(2*nod+1, m+1, dr, stq, drq);

}

int main()
{
  fin>>n>>m;
  for(int i=1; i<=n; i++)
    fin>>A[i];
  build(1,1,n);
  for(int i=0; i<m; i++)
  {
    int a, b, t;
    fin>>t>>a>>b;
    if(t==1)
      update(1, 1, n, a, b);
    else
    {
      query(1, 1, n, a, b);
      fout<<res<<'\n';
      res=-1;
    }

  }
  return 0;
}