Cod sursa(job #2982923)

Utilizator BuruianaRaresAndreiBuruiana Rares Andrei BuruianaRaresAndrei Data 21 februarie 2023 09:57:44
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#define NMAX 100003

using namespace std;

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

int n, m;
int v[NMAX];
int arb[4*NMAX];

void build(int nod, int st, int dr);
void update(int nod, int st, int dr, int poz, int val);
int query(int nod, int st, int dr, int l, int r);


int main()
{
 int i;
 fin>>n>>m;
 for(i=1; i<=n; i++)
     fin>>v[i];
 build(1, 1, n);
 for(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;
}

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) ///intervalul fiului stang este [st, mij]
    update(nod*2, st, mij, poz, val);
 else ///trebuie sa mergem in parintele drept
     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)
    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;
}