Cod sursa(job #1700069)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 9 mai 2016 12:12:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int Nmax=100005;

int v[4*Nmax],place[Nmax],maxx;

void dfs(int pos,int st,int dr)
{
    if(st==dr)
    {
        place[st]=pos;
        return;
    }

    dfs(2*pos,st,(st+dr)/2);
    dfs(2*pos+1,(st+dr)/2+1,dr);
}

void up(int pos)
{
    if(pos==0) return;
    v[pos]=max(v[2*pos],v[2*pos+1]) ;
    up(pos/2);
}

void query(int pos,int st,int dr,int a,int b)
{
    if(st>=a and dr<=b)
    {
        if(v[pos]>maxx) maxx=v[pos];
        return;
    }
    if(dr<a) return;
    if(st>b) return;

    query(2*pos,st,(st+dr)/2,a,b);
    query(2*pos+1,(st+dr)/2+1,dr,a,b);
}


int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    int n,m,i,j,x,p,a,b;

    scanf("%d%d",&n,&m);

    dfs(1,1,n);

    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        v[place[i]]=x;
        up(place[i]/2);
    }

    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&p,&a,&b);

        if(p==0)
        {
            maxx=0;
            query(1,1,n,a,b);
            printf("%d\n",maxx);
        }
        else
        {
            v[place[a]]=b;
            up(place[a]/2);
        }
    }



    return 0;
}