Cod sursa(job #771747)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 26 iulie 2012 22:05:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int maxTree[262144],maxim,a,b,value,position;
void update(int root,int left,int right)
{
    if(left==right)
    {
        maxTree[root]=value;
    }
    else
    {
        int middle=left+(right-left)/2;
        if(position<=middle) update(2*root,left,middle);
        else update(2*root+1,middle+1,right);
        maxTree[root]=max(maxTree[2*root],maxTree[2*root+1]);
    }
}
void query(int root,int left,int right)
{
    if(a<=left&&right<=b)
    {
        maxim=max(maxTree[root],maxim);
    }
    else
    {
        int middle=left+(right-left)/2;
        if(a<=middle) query(2*root,left,middle);
        if(middle<b) query(2*root+1,middle+1,right);
    }
}
int main()
{
    int i,n,m,k,root=1,q;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&k);
        value=k; position=i;
        update(root,1,n);
    }
    for(;m;--m)
    {
        scanf("%d %d %d",&q,&a,&b);
        maxim=-1;
        if(q==0) {query(root,1,n); printf("%d\n",maxim);}
        if(q==1) {value=b; position=a; update(root,1,n);}
    }
    return 0;
}