Cod sursa(job #1991653)

Utilizator victoreVictor Popa victore Data 17 iunie 2017 20:06:40
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<cstdio>

const int nmax=1e5+5;

int n,q,v[nmax],arb[4*nmax+66];

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

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

inline int query(int node,int st,int dr,int l,int r)
{
    if(l<=st&&dr<=r)
        return arb[node];
    if(l>dr||r<st)
        return 0;
    int med=(st+dr)/2;
    return max(query(2*node,st,med,l,r),query(2*node+1,med+1,dr,l,r));
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int i;
    scanf("%d%d",&n,&q);
    for(i=1;i<=n;++i)
        scanf("%d",&v[i]);
    buildtree(1,1,n);
    int op,a,b;
    for(i=1;i<=q;++i)
    {
        scanf("%d%d%d",&op,&a,&b);
        if(op)
        {
            v[a]=b;
            buildtree(1,1,n);
        }
        else
            printf("%d\n",query(1,1,n,a,b));
    }
}