Cod sursa(job #2925810)

Utilizator Luca529Taschina Luca Luca529 Data 16 octombrie 2022 10:19:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int x[400001],y[100001];

void Build(int nod, int st, int dr)
{if(st==dr)
 x[nod]=y[st];
 else
 {int mij=(st+dr)/2;
  Build(nod*2, st, mij);
  Build(nod*2+1, mij+1, dr);

  x[nod]=max(x[nod*2], x[nod*2+1]);
 }
}

void Update(int nod, int st, int dr, int p, int v)
{if(st==dr)
 x[nod]=v;
 else
 {int mij=(st+dr)/2;
  if(mij>=p)Update(nod*2, st, mij, p, v);
  else Update(nod*2+1, mij+1, dr, p, v);

  x[nod]=max(x[nod*2], x[nod*2+1]);
 }
}

int Query(int nod, int st, int dr, int qs, int qd)
{if(st>=qs && dr<=qd)
 return x[nod];
 else
 {int mij=(st+dr)/2;
  if(mij>=qd)return Query(nod*2, st, mij, qs, qd);
  if(mij<qs)return Query(nod*2+1, mij+1, dr, qs, qd);

  int a=Query(nod*2, st, mij, qs, qd), b=Query(nod*2+1, mij+1, dr, qs, qd);

  return max(a, b);
 }
}

int main()
{   int n,m,a,b,c;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    fin>>y[i];

    Build(1, 1, n);

    for(int i=1;i<=m;i++)
    {fin>>a>>b>>c;
     if(a==1)Update(1, 1, n, b, c);
     else fout<<Query(1, 1, n, b, c)<<"\n";
    }

    return 0;
}