Cod sursa(job #772538)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 30 iulie 2012 10:48:42
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int tree[200010],n,m,n2,a,b,maximum;
void update()
{
    tree[n2+a-1]=b;
    int node;
    for(node=(n2+a-1)/2;node>=1;node>>=1) tree[node]=max(tree[2*node],tree[2*node+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)/2;
        if(a<=middle) query(2*node,left,middle);
        if(middle<b) query(2*node+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;
}