Cod sursa(job #1776983)

Utilizator priboiraduPriboi Radu Bogdan priboiradu Data 11 octombrie 2016 23:15:18
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda cerculdeinfo-lectia2-arborideintervale Marime 1.68 kb
#include <stdio.h>
#include <stdlib.h>

int v[100000], aint[1<<18+1];
int rez;

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

void arboreInterval( int st, int dr, int p ) {
    if ( st == dr )
        aint[p] = v[st];
    else {
        arboreInterval( st, ( st + dr ) / 2, 2 * p );
        arboreInterval( ( st + dr ) / 2 + 1, dr, 2 * p + 1 );
        aint[p] = max( aint[2*p], aint[2*p+1] );
    }
}

void update( int st, int dr, int p, int poz ) {
    if ( st == dr )
        aint[p] = v[st];
    else {
        if ( poz <= ( st + dr ) / 2 )
            update( st, ( st + dr ) / 2, 2 * p, poz );
        else
            update( ( st + dr ) / 2 + 1, dr, 2 * p + 1, poz );
        aint[p] = max( aint[2*p], aint[2*p+1] );
    }
}

void query( int st, int dr, int p, int a, int b ) {
    if ( a <= st && dr <= b )
        rez = max( rez, aint[p] );
    else {
        if ( a <= ( st + dr ) / 2 )
            query( st, ( st + dr ) / 2, 2 * p, a, b );
        if ( ( st + dr ) / 2 + 1 <= b )
            query( ( st + dr ) / 2 + 1, dr, 2 * p + 1, a, b );
    }
}

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