Cod sursa(job #1523833)

Utilizator kassay_akosKassay Akos kassay_akos Data 13 noiembrie 2015 13:17:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <fstream>

using namespace std;

#define iFileName "arbint.in"
#define oFileName "arbint.out"
#define dim 100001

int arb[4*dim + 66];                                                    // nem tudom miert pont 4*dim+66
int maxim,N,M;

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

void Update(int nodId, int start, int finish, int pozi, int valo) ;
void Querry(int nodId, int start, int finish, int from, int to ) ;

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%i %i",&N,&M);
    int X,A,B;

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

    for ( int i = 0; i < M; i++) {
        scanf("%i %i %i",&X,&A,&B);

        if (X == 0) {
            maxim = -1;
            Querry(1,1,N,A,B);
            printf("%i \n",maxim);
        }
        else {
            Update(1,1,N,A,B);
        }

    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

void Update(int nodId, int start, int finish, int pozi, int valo)
{
    if (start == finish) {
        arb[nodId] = valo ;
        return ;
    }
    int mid = ((start + finish) >> 1);
    if (pozi <= mid ){
        Update((nodId<<1),start,mid,pozi,valo) ;
    }
    else {
        Update((nodId<<1) + 1, mid+1,finish,pozi,valo) ;
    }
    arb[nodId] = Maxim(arb[nodId<<1],arb[(nodId<<1)+1]);
}

void Querry(int nodId, int start, int finish, int from, int to)
{
    if (from <= start && finish <= to ) {
        if (maxim < arb[nodId] )  maxim = arb[nodId] ;
        return ;
    }

    int mid = ((start + finish)>>1) ;
    if ( from <= mid ) Querry((nodId<<1), start, mid, from, to);
    if ( mid < to)  Querry((nodId<<1)+1, mid+1, finish, from, to);
}