Cod sursa(job #2479741)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 24 octombrie 2019 14:07:49
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <algorithm>

using namespace std;

int arb[400005];

inline void u(int p,int x)
{
    int k,y;
    arb[p]=x;
    while(p>1)
    {
        k=p/2;
        y=max(arb[2*k],arb[2*k+1]);
        if(y!=arb[k])
            arb[k]=y;
        else
            return ;
        p=k;
    }
}

inline int q(int nod, int x,int y,int st,int dr)
{
    int m;
    if(x==st&&y==dr)
        return arb[nod];
    m=(st+dr)/2;
    if(y<=m)
        return q(nod*2,x,y,st,m);
    else
        if(x>m)
            return q(nod*2+1,x,y,m+1,dr);
        else
            return max(q(nod*2,x,m,st,m), q(nod*2+1,m+1,y,m+1,dr));
}

int main()
{
    int tip,x,y,m,n;
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    cin>>n>>m;
    int p=1;
    while(p<n)
    {
        p=p*2;
    }
    for(int i=p;i<p+n;i++)
        cin>>arb[i];
    for(int i=p-1;i>0;i--)
        arb[i]=max(arb[i*2], arb[i*2+1]);
    while(m--)
    {
        cin>>tip>>x>>y;
        if(tip==0)
            cout<<q(1,x,y,1,p)<<"\n";
        else
            u(n-1+x,y);
    }
    return 0;
}