Cod sursa(job #2585992)

Utilizator denisaaabBucur Denisa Andreea denisaaab Data 19 martie 2020 16:19:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int a[400005],n,m;
int tipop,x,y;
void adaugare(int st, int dr, int i, int poz)
{
    if(st==dr || st>dr)
    {
        a[poz]=x;
        return;
    }
    int mij=(st+dr)/2;
    if(i>mij)
    {
        adaugare(mij+1, dr, i, poz*2+1);
    }
    else adaugare(st, mij, i, poz*2);
    a[poz]=max(a[poz*2],a[poz*2+1]);

}
int query(int st, int dr, int starb, int drarb, int poz)
{
    if(dr<starb|| (starb == drarb && st!=dr))
        return 0;
    if(st == starb && dr==drarb)
        return a[poz];
    int mij=(starb+drarb)/2;
    int mx1=0, mx2=0;
    if(st<=mij)
        mx1=query(st, min(dr,mij), starb, mij, poz*2);
    if(dr>mij)
        mx2=query(max(st,mij+1), dr, mij+1, drarb, poz*2+1);
    return max(mx1, mx2);
}
int main()
{
    f>>n>>m;
    for(int i=1; i<=n; i++)
    {
        f>>x;
        adaugare(1,n,i,1);
    }
    for(int i=1; i<=m; i++)
    {
        f>>tipop>>y>>x;
        if(tipop==1)
            adaugare(1,n,y,1);
        else g<<query(y,x,1,n,1)<<'\n';
    }
    return 0;
}