Cod sursa(job #772531)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 30 iulie 2012 10:37:44
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int tree[200010],n,m,n2,a,b,maximum;
void update()
{
    int node=n2+a-1;
    tree[node]=b;
    for(node=node>>1;node>=1;node=node>>1) tree[node]=max(tree[node<<1],tree[node<<1+1]);
}
void query(int node,int left,int right)
{
    if(a<=left&&right<=b)
    {
        maximum=max(maximum,tree[node]);
    }
    else
    {
        int middle=left+((right-left)>>1);
        if(a<=middle) query((node<<1),left,middle);
        if(middle<b) query((node<<1)+1,middle+1,right);
    }
}
int main()
{
    int p,i;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(n2=1;n2<n;n2<<=1);
    for(i=n2;i<=n2+n-1;++i) scanf("%d",&tree[i]);
    for(i=n2-1;i>=1;--i) tree[i]=max(tree[2*i],tree[2*i+1]);
    for(;m;--m)
    {
        scanf("%d %d %d",&p,&a,&b);
        if(p==1) update();
        else {maximum=-1; query(1,1,n2); printf("%d\n",maximum);}
    }
    return 0;
}