Cod sursa(job #1989762)

Utilizator victoreVictor Popa victore Data 8 iunie 2017 20:27:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<cstdio>

const int nmax=1e5+4;

int arb[4*nmax+66],v[nmax];
int n,m,start,finish;

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

inline void build(int node,int st,int dr)
{
    if(st==dr)
    {
        arb[node]=v[st];
        return;
    }
    int med=(st+dr)/2;
    build(2*node,st,med);
    build(2*node+1,med+1,dr);
    arb[node]=maxim(arb[2*node],arb[2*node+1]);
}

inline void update(int node,int st,int dr)
{
    if(st==dr)
    {
        arb[node]=finish;
        return;
    }
    int med=(st+dr)/2;
    if(start<=med)
        update(2*node,st,med);
    else
        update(2*node+1,med+1,dr);
    arb[node]=maxim(arb[2*node],arb[2*node+1]);
}

inline int query(int node,int st,int dr)
{
    if(start<=st&&dr<=finish)
        return arb[node];
    if(start>dr||finish<st)
        return -1;
    int med=(st+dr)/2;
    return maxim(query(2*node,st,med),query(2*node+1,med+1,dr));
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int i,j;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
        scanf("%d",&v[i]);
    build(1,1,n);
    int op;
    while(m--)
    {
        scanf("%d%d%d",&op,&start,&finish);
        if(op)
            update(1,1,n);
        else
            printf("%d\n",query(1,1,n));
    }
}