Cod sursa(job #1221136)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 19 august 2014 17:01:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <algorithm>

using namespace std;
int Arb[300010],a[100010],x,y,n,m,i,cod;
void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        Arb[nod]=a[st];
        return;
    }
    int m=(st+dr)/2,fiu_st=2*nod,fiu_dr=fiu_st+1;
    build(fiu_st,st,m);
    build(fiu_dr,m+1,dr);
    Arb[nod]=max(Arb[fiu_st],Arb[fiu_dr]);
}
void update(int nod,int st,int dr)
{
    if(st==dr)
    {
        Arb[nod]=y;
        return;
    }
    int m=(st+dr)/2,fiu_st=2*nod,fiu_dr=fiu_st+1;
    if(x<=m)
        update(fiu_st,st,m);
    else
        update(fiu_dr,m+1,dr);
    Arb[nod]=max(Arb[fiu_st],Arb[fiu_dr]);
}
int query(int nod,int st,int dr)
{
    if(st>=x&&dr<=y)
        return Arb[nod];
    int m=(st+dr)/2,fiu_st=2*nod,fiu_dr=fiu_st+1,vs=0,vd=0;
    if(x<=m)vs=query(fiu_st,st,m);
    if(y>m)vd=query(fiu_dr,m+1,dr);
    return max(vs,vd);
}
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]);
    build(1,1,n);
    for(;m;m--)
    {
        scanf("%d%d%d",&cod,&x,&y);
        if(cod==0)
            printf("%d\n",query(1,1,n));
        else
            update(1,1,n);
    }
    return 0;
}