Cod sursa(job #3340229)

Utilizator BidonTurtitBezdedan Eric BidonTurtit Data 12 februarie 2026 22:09:05
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#define Max 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int arb[4*Max],n,m;

void update(int val, int pos, int st, int dr,int nod);
void query(int a, int b, int st, int dr, int nod, int &mx);

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        fin>>x;
        update(x,i,1,n,1);

    }
    for(int i=1;i<=m;i++)
    {
        int c,a,b;
        fin>>c>>a>>b;
        if(c==1)
        {
            update(b,a,1,n,1);
        }
        if(c==0)
        {
            int mx=-1;
            query(a,b,1,n,1,mx);
            fout<<mx<<"\n";
        }

    }
    return 0;
}

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

void query(int a, int b, int st, int dr, int nod, int &mx)
{
    if(a<=st && dr<=b)
    {
        if(mx<arb[nod])
            mx=arb[nod];
        return;
    }
    int mij=(st+dr)/2;
    if(a<=mij)
        query(a,b,st,mij,nod*2,mx);
    if(mij<=b)
        query(a,b,mij+1,dr,nod*2+1,mx);
}