Cod sursa(job #2129640)

Utilizator aeromaniaXRadoi Iulian aeromaniaX Data 12 februarie 2018 22:59:57
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
//It's too cold outside

#include <bits/stdc++.h>
using namespace std;

int arb[4*100001+100];
int n,m,a,b,Max,start,stop,val,indice,test;

inline int maxim(int a, int b)
{
    if(a>b)return a;
    else return b;
}

inline void update(int nod, int st, int dr)
{
    if(st == dr)
    {
        arb[nod]=val;
        return;
    }

    int mij=(st+dr)/2;
    if(indice <= mij) update(nod*2,st,mij);
    else update(nod*2+1,mij+1,dr);

    arb[nod] = maxim(arb[nod*2+1],arb[nod*2]);
}

inline void query(int nod, int st, int dr)
{
    if(start <= st && dr <=stop)
    {
        Max=maxim(Max,arb[nod]);
        return;
    }
    int mij=(st+dr)/2;

    if(start <=mij) query(nod*2,st,mij);
    if (mij<dr)query(nod*2+1,mij+1,dr);


}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);

    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a);

        indice = i;
        val = a;
        update(1,1,n);
    }

    for(int i=1;i<=m;i++)
    {
        scanf("%d",&test);
        scanf("%d %d",&a,&b);

                if(test==0)
                {
                    Max=-1;
                    start=a,stop=b;
                    query(1,1,n);
                    printf("%d\n",Max);
                }
                else{
                    indice = a, val = b;
                    update(1,1,n);
                }

    }
    return 0;
}