Cod sursa(job #981056)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 6 august 2013 12:26:03
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 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)/2;
    if(poz<=mij)
    {
        update(nod*2,st,mij,poz,val);
    }
    else update(nod*2+1,mij+1,dr,poz,val);
    if(t[nod*2]>t[nod*2+1])
    {
        t[nod]=t[nod*2];
    }
    else t[nod]=t[nod*2+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)/2;
    int sol=-1;
    if(x<=mij)
    {
        sol=mx(sol,query(nod*2,st,mij,x,y));
    }
    if(y>mij)
    {
        sol=mx(sol,query(nod*2+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;
}