Cod sursa(job #2479740)

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

using namespace std;

int arb[400005];

inline void Update(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 Query(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 Query(nod*2,x,y,st,m);
    else
        if(x>m)
            return Query(nod*2+1,x,y,m+1,dr);
        else
            return max(Query(nod*2,x,m,st,m), Query(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<<Query(1,x,y,1,n)<<"\n";
        else
            Update(n-1+x,y);
    }
    return 0;
}