Cod sursa(job #2637585)

Utilizator driver71528@gmail.comTerec Andrei-Sorin [email protected] Data 23 iulie 2020 16:53:10
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");
int arb[262200];
int x[100001];
int n,m;

void construire(int node,int st,int dr)
{
    if(st==dr)
        arb[node]=x[st];
    else
    {
        int mij=(st+dr)/2;
        construire(node*2,st,mij);
        construire(node*2+1,mij+1,dr);
        arb[node]=max(arb[node*2],arb[node*2+1]);
    }
}
int poz,val;
void update(int node,int st,int dr)
{
    if(st==dr)
        arb[node]=val;
    else
    {
        int mij=(st+dr)/2;
        if(poz<=mij)
            update(node*2,st,mij);
        else
            update(node*2+1,mij+1,dr);
        arb[node]=max(arb[node*2],arb[node*2+1]);
    }
}

int a,b;
int getMax(int node,int st,int dr)
{
    if(a<=st && dr<=b)
        return arb[node];
    else
    {
        int mij=(st+dr)/2;
        int rez=-1;
        if(a<=mij)
            rez=getMax(node*2,st,mij);
        if(mij+1<=b)
            rez=max(getMax(node*2+1,mij+1,dr),rez);
        return rez;
    }
}
int main()
{
    int tip;
    f>>n>>m;
    for(int i=1;i<=n;i++)
        f>>x[i];
    construire(1,1,n);

    for(int i=1;i<=m;i++)
    {
        f>>tip;
        if(tip==0)
        {
            f>>a>>b;
            g<<getMax(1,1,n)<<'\n';
        }
        else
        {
            f>>poz>>val;
            update(1,1,n);
        }
    }
    f.close();
    g.close();
    return 0;
}