Cod sursa(job #2567153)

Utilizator federicisFedericis Alexandru federicis Data 3 martie 2020 15:31:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

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

int n,m;
 long long a[500000],val,poz,maxim,inc,sf;

void update(int nod,int st,int dr);
void query(int nod,int st,int dr);

int main()
{ in>>n>>m;
for(int i=1;i<=n;i++)
{ int x;
    in>>x;
    val=x;poz=i;
    update(1,1,n);
}
for(int i=1;i<=m;i++)
{
 bool cerinta;
 int stanga,dreapta;
 in>>cerinta>>stanga>>dreapta;///cout<<cerinta<<" "<<stanga<<" "<<dreapta<<'\n';;
 if(cerinta==1)
 { val=dreapta;
 poz=stanga;
     update(1,1,n);
 }
 else
 {
   maxim=-1;
   inc=stanga;
   sf=dreapta;
   query(1,1,n);
   out<<maxim<<'\n';
 }

}
    return 0;
}

void update(int nod, int st, int dr)
{
 if(st==dr)
 {
     a[nod]=val;
     return;
 }
 int div=(st+dr)/2;
 if(poz<=div) update(2*nod,st,div);
    else  update(2*nod+1,div+1,dr);
 a[nod]=max(a[2*nod],a[2*nod+1]);
}

void query(int nod,int st, int dr)
{
    if(inc<=st&&sf>=dr)
    {
        if(a[nod]>maxim) maxim=a[nod];
        return;
    }
    int div=(st+dr)/2;
    if(inc<=div) query(2*nod,st,div);
    if(sf>div) query(2*nod+1,div+1,dr);
}