Cod sursa(job #2573353)

Utilizator CarlaDianaCarla Diana CarlaDiana Data 5 martie 2020 17:15:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n,m,v[100010],cer,a,b;
int maxx;
pair< pair<int,int>,int>arb[500010];

void creare(int nod,int st,int dr)
{
    int mij;
    arb[nod].first.first=st;
    arb[nod].first.second=dr;
    if(st==dr)
        arb[nod].second=v[st];
    else
    {
        mij=(st+dr)/2;
        creare(nod*2,st,mij);
        creare(nod*2+1,mij+1,dr);
        arb[nod].second=max(arb[nod*2].second,arb[nod*2+1].second);
    }
}

void maxim(int nod)
{
    int st=arb[nod].first.first;
    int dr=arb[nod].first.second;
    if(a<=st&&dr<=b)
        maxx=max(maxx,arb[nod].second);
    else
    {
        int mij=(st+dr)/2;
        if(a<=mij) maxim(nod*2);
        if(mij<b) maxim(nod*2+1);
    }
}

void actualizare(int nod)
{
    int st=arb[nod].first.first;
    int dr=arb[nod].first.second;
    if(st==dr)
        arb[nod].second=b;
    else
    {
        int mij=(st+dr)/2;
        if(a<=mij) actualizare(nod*2);
        else actualizare(nod*2+1);
        arb[nod].second=max(arb[nod*2].second,arb[nod*2+1].second);
    }
}



int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    creare(1,1,n);
    for(;m;m--)
    {
        fin>>cer>>a>>b;
        if(cer==0)
        {
            maxx=0;
            maxim(1);
            fout<<maxx<<'\n';
        }
        else
        {
            ///v[a]=b;
            actualizare(1);
        }
    }
    return 0;
}