Cod sursa(job #1968383)

Utilizator delia_99Delia Draghici delia_99 Data 17 aprilie 2017 17:38:28
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int NMAX=100000;

int n,m,i;
int arb[2*NMAX+5];

void build()
{
    for(int i=n-1; i; --i)
        arb[i]=max(arb[2*i],arb[2*i+1]);
}

void update(int pos,int val)
{
    arb[pos]=val;
    for(pos/=2; pos; pos/=2)
        arb[pos]=max(arb[2*pos],arb[2*pos+1]);
}

int query(int st,int dr)
{
    int sol=-1;

    while(st<=dr)
    {
        if(st%2==1)
            sol=max(sol,arb[st++]);
        if(dr%2==0)
            sol=max(sol,arb[dr--]);
        st/=2;
        dr/=2;
    }
    return sol;
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d%d",&n,&m);

    for(i=0; i<n; ++i)
        scanf("%d",&arb[i+n]);

    build();

    for(i=1; i<=m; ++i)
    {
        int op,a,b;

        scanf("%d%d%d",&op,&a,&b);

        if(op==0)
            printf("%d\n",query(a+n-1,b+n-1));
        else update(a+n-1,b);
    }
    return 0;
}