Cod sursa(job #1796986)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 3 noiembrie 2016 22:05:27
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <stdio.h>
using namespace std;
FILE *fin = fopen("arbint.in" , "r");
FILE *fout = fopen("arbint.out" , "w");
# define MAXN 100000
int MaxArb[5 * MAXN +1];
int pos , val , start , finish , maxim , m , n ,x ,tip ,a ,b ,j;
void update();
void intrebare();
int Maxim(int a , int b)
{
    if(a > b) return a;
    return b;
}
void update(int nod, int st , int dr)
{
    if(st == dr)
    {
        MaxArb[nod] = val;//sunt pe ultimul nivel al arborelui si update
        return;
    }
    int mij;
    mij = (st + dr) / 2;
    if(pos <= mij) update(2 * nod,st,mij); //ale interval stanga
    else update(2 * nod + 1,mij + 1,dr);//aleg interval dreapta
    MaxArb[nod] = Maxim(MaxArb[nod*2] , MaxArb[nod*2+1]);
}
void intrebare(int nod , int st, int dr)
{
    if(start <= st && dr <= finish)
    {
        if( MaxArb[nod] > maxim) maxim = MaxArb[nod];
        return;
    }
    int mij;
    mij = (st + dr) / 2;
    if(mij >= start) intrebare(2 * nod, st , mij);
    if(mij < finish) intrebare(2 * nod + 1, mij + 1, dr);
}
int main()
{
    fscanf(fin , "%d%d" , &n , &m);
    for( j = 1; j <= n; j++ );
    {
        fscanf(fin , "%d", &x);
        val = x;
        pos = j;
        update(1,1,n);
    }
    for(j = 1; j <= m; j++)
    {
        fscanf(fin , "%d", &tip);
        if(tip == 1)
        {
            fscanf(fin , "%d%d", &a , &b);
            val = b;
            pos = a;
            update(1,1,n);
        }
        else
        {
            fscanf(fin , "%d%d", &a, &b);
            start = a;
            finish = b;
            maxim = -1;
            intrebare(1,1,n);
            fprintf(fout , "%d\n" , maxim);
        }//
    }
    return 0;
}