Cod sursa(job #1178477)

Utilizator hrazvanHarsan Razvan hrazvan Data 26 aprilie 2014 18:41:21
Problema Arbori de intervale Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#define ARB_MAX 2000000

int arb[ ARB_MAX ];

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

void update ( int st, int dr, int pozc, int poz, int nr ){
    if ( st == poz && dr == poz ){
        arb[ pozc ] = nr;
        return ;
    }
    int mijl = ( st + dr ) / 2;
    if ( mijl >= poz ){
        update ( st, mijl, pozc * 2 + 1, poz, nr );
    }
    else{
        update ( mijl + 1, dr, pozc * 2 + 2, poz, nr );
    }
    arb[ pozc ] = max ( arb[ pozc * 2 + 1 ], arb[ pozc * 2 + 2 ] );
    return ;
}

int query ( int st, int dr, int n, int pozc, int cst, int cdr ){
    if ( st <= cst && dr >= cdr || cst == cdr )   return arb[ pozc ];
    int mijl = ( cst + cdr ) / 2, maxc = 0;
    if ( st <= mijl )   maxc = max ( maxc, query ( st, dr, n, pozc * 2 + 1, cst, mijl ));
    if ( dr > mijl )   maxc = max ( maxc, query ( st, dr, n, pozc * 2 + 2, mijl + 1, cdr ) );
    return maxc;
}

int main()
{
    FILE *in = fopen ( "arbint.in", "r" );
    int n, m;
    fscanf ( in, "%d%d", &n, &m );
    int i, a;
    for ( i = 0; i < n; i++ ){
        fscanf ( in, "%d", &a );
        update ( 0, n - 1, 0, i, a );
    }
    FILE *out = fopen ( "arbint.out", "w" );
    int b, c, rez;
    for( i = 0; i < m; i++ ){
        fscanf ( in, "%d%d%d", &a, &b, &c );
        b--;
        if ( a == 1 ){
            update ( 0, n - 1, 0, b, c );
        }
        else{
            c--;
            rez = query ( b, c, n - 1, 0, 0, n - 1 );
            fprintf ( out, "%d\n", rez );
        }
    }
    fclose ( in );
    fclose ( out );
    return 0;
}