Cod sursa(job #1042941)

Utilizator Emanuel9Dumitru Emanuel Cristian Emanuel9 Data 27 noiembrie 2013 20:07:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <stdio.h>
using namespace std;

#define mar 100001

int Arb[4*mar];
int n,m;
int start,finish,val,pos,maxim;

inline int max(int a,int b){
    if(a>b)
        return a;
    return b;
}

void Update(int,int,int);
void Query(int,int,int);

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


    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        pos=i;
        val=x;
        Update(1,1,n);

    }
    for(int i=1;i<=m;i++){

        scanf("%d%d%d",&x,&a,&b);
        if(x==0){
            maxim=-1;
            start=a;
            finish=b;
            Query(1,1,n);
            printf("%d\n",maxim);

        }else{
            pos=a;
            val=b;
            Update(1,1,n);
        }

    }
    return 0;
}

void Update(int node,int left,int right){
    if(left==right){
        Arb[node]=val;
        return;
    }

    int m = (left+right)/2;
    if(pos<=m)
        Update(2*node,left,m);
    else
        Update(2*node+1,m+1,right);
    Arb[node]=max(Arb[2*node],Arb[2*node+1]);
}

void Query(int node,int left,int right){

    if(start<=left && right<=finish)
    {
        if(maxim < Arb[node])
            maxim=Arb[node];
        return;
    }

    int m=(left+right)/2;
    if(start<=m)
        Query(2*node,left,m);
    if(m<finish)
        Query(2*node+1,m+1,right);

}