Cod sursa(job #1523820)

Utilizator kassay_akosKassay Akos kassay_akos Data 13 noiembrie 2015 12:56:15
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 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,Val,Pos, Pos2;

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

void Update(int nodId, int start, int finish) ;
void Querry(int nodId, int start, int finish) ;

int main()
{
    ifstream iFile;
    ofstream oFile;
    int a;

    iFile.open(iFileName);
    oFile.open(oFileName);
    iFile >> N >> M ;

    for (int i = 1; i<=N; i++) {
        iFile >> Val ;
        Pos = i;
        Update(1,1,N);
    }

    for ( int i = 0; i < M; i++) {
        iFile >> a >> Pos >> Pos2 ;

        if (a == 0) {
            maxim = -1;
            Querry(1,1,N);
            oFile << maxim <<endl;
        }
        else {
            Val = Pos2;
            Update(1,1,N);
        }

    }
    oFile.close();
    iFile.close();
    return 0;
}

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

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

    int mid = ((start + finish)>>2) ;
    if ( Pos <= mid ) Querry((nodId<<2), start, mid ) ;
    if ( mid < Pos2)  Querry((nodId<<2)+1, mid+1, finish);
}