Cod sursa(job #771741)

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