Cod sursa(job #2982922)

Utilizator serbanducanDucan Andrei Serban serbanducan Data 21 februarie 2023 09:57:23
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

int n,m,v[100005];
int arb[400005];

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

void update(int nod,int st,int dr, int poz,int val)
{
  if(st==dr)
  {
    arb[nod]=val; return;
  }
  int mij=(st+dr)/2;
  if(poz<=mij)///intevalul fiului stang este [st,mij]
    update(nod*2,st,mij,poz,val);
  else
    update(nod*2+1,mij+1,dr,poz,val);
    arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}

int query(int nod, int st,int dr, int l,int r)
{
    if(st>=l && dr<=r) return arb[nod];
    int mij=(st+dr)/2;
    int rez=0;
    if(mij>=l) ///mij inclus in [l,r]
        rez=max(rez,query(nod*2,st,mij,l,r));
    if(mij+1<=r)
        rez=max(rez,query(nod*2+1,mij+1,dr,l,r));
    return rez;
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
       fin>>v[i];
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
      int tip; fin>>tip;
      if(tip==1)
      {
        int poz,val;
        fin>>poz>>val;
        update(1,1,n,poz,val);
      }
      else
      {
        int l,r;
        fin>>l>>r;
        fout<<query(1,1,n,l,r) << '\n';
      }
    }
    return 0;
}