Cod sursa(job #981063)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 6 august 2013 12:45:26
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<cstdio>

using namespace std;

int x,y,t[400000],a[100006],n,i,m,tip;

int mx(int x,int y)
{
    if(x>y)
        return x;
    return y;
}

void update(int nod,int st,int dr,int poz,int val)
{
    if(st==poz&&dr==poz)
    {
        t[nod]=val;
        return;
    }
    int mij=(st+dr)>>1;
    if(poz<=mij)
        update(nod<<1,st,mij,poz,val);
    else update((nod<<1)+1,mij+1,dr,poz,val);
    if(t[nod<<1]>t[(nod<<1)+1])
        t[nod]=t[nod<<1];
    else t[nod]=t[(nod<<1)+1];
}

int query(int nod,int st,int dr,int x,int y)
{
    if(x<=st&&y>=dr)
        return t[nod];
    int mij=(st+dr)>>1;
    int sol=-1;
    if(x<=mij)
        sol=mx(sol,query(nod<<1,st,mij,x,y));
    if(y>mij)
        sol=mx(sol,query((nod<<1)+1,mij+1,dr,x,y));
    return sol;
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
        update(1,1,n,i,a[i]);
    }
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&tip,&x,&y);
        if(tip==1)
            update(1,1,n,x,y);
        else
            printf("%d\n",query(1,1,n,x,y));
    }
    return 0;
}