Cod sursa(job #1150999)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 23 martie 2014 19:46:19
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
//arbint- BATOG
#include <cstdio>
#include <cmath>
#define MAXN 100000

int v[MAXN], bucati[500];

int main () {
    FILE *f, *g;
    f = fopen( "arbint.in", "r" );
    g = fopen( "arbint.out", "w" );

    int n, m, rad, max, stop, a, b, tip, ba, bb, start;

    fscanf( f, "%d%d", &n, &m );

    for( int i = 0 ; i < n ; ++i )
        fscanf( f, "%d", &v[i] );

    rad = sqrt( n );

    for( int i = 0, buc = 0 ; i < n ; i += rad, ++buc ) {
        max = -1;
        stop = i + rad - 1;
        if( stop >= n )
            stop = n;
        for( int j = i ; j <= stop ; ++j )
            if( v[j] > max )
                max = v[j];
        bucati[buc] = max;
    }

    for( int i = 0 ; i < m ; ++i ) {
        fscanf( f, "%d%d%d", &tip, &a, &b );
        --a;
        --b;
        if( tip == 1 ) {
            ++b;
            v[a] = b;
            max = -1;
            ba = a / rad;
            for( int j = ba * rad ; j < (ba+1) * rad ; ++j )
                if( v[j] > max )
                    max = v[j];
            bucati[ba] = max;
        }
        else {
            max = -1;
            ba = a / rad;
            bb = b / rad;
            for( int j = ba + 1 ; j < bb ; ++j ) //buvata a : (ba-1) * rad... ba*rad - 1
                if( bucati[j] > max )
                    max = bucati[j];

            stop = (ba+1) * rad - 1;
            if( stop > b )
                stop = b;

            for( int j = a ; j <= stop ; ++j )
                if( v[j] > max )
                    max = v[j];

            start = bb * rad;
            if( start < a )
                start = a;
            for( int j = start ; j <= b ; ++j )
                if( v[j] > max )
                    max = v[j];

            fprintf( g, "%d\n", max );
        }
    }

    fclose( f );
    fclose( g );
    return 0;
}