Cod sursa(job #1096087)

Utilizator gabrielvGabriel Vanca gabrielv Data 1 februarie 2014 15:16:53
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>

using namespace std;

#define maxim(a,b) ((a>b)?(a):(b))

#define NMAX 100015

int SegT[4*NMAX];
int Sol;
int N,M;

inline int left_son(int nod)
{
    return nod<<1;
}
inline int right_son(int nod)
{
    return (nod<<1)+1;
}

void Update(int nod, int left, int right, int val, int pos)
{
    if(left==right)
    {
        SegT[nod] = val;
        return;
    }

    int mid = (left+right)/2;
    if(pos<=mid)
    {
        Update(left_son(nod),left,mid,val,pos);
        SegT[nod] = SegT[left_son(nod)];
    }
    else
    {
        Update(right_son(nod),mid+1,right,val,pos);
        SegT[nod] = maxim(SegT[left_son(nod)],SegT[right_son(nod)]);
    }
}

void Query(int nod, int left, int right, int beginI, int endI)
{
    if(beginI<= left && right<=endI)
    {
        Sol = maxim(Sol,SegT[nod]);
        return;
    }

    int mid = (left+right)/2;

    if(beginI<=mid)
        Query(left_son(nod),left,mid,beginI,endI);
    if(endI>mid)
        Query(right_son(nod),mid+1,right,beginI,endI);
}

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

    scanf("%d%d",&N,&M);
    for(int i=1,x;i<=N;i++)
    {
        scanf("%d",&x);
        Update(1,1,N,x,i);
    }

    for(int i=1,op,x,y;i<=M;i++)
    {
        scanf("%d%d%d",&op,&x,&y);

        if(op)
            Update(1,1,N,y,x);
        else
        {
            Sol=-1;
            Query(1,1,N,x,y);
            printf("%d\n",Sol);
        }
    }

    return 0;
}