Cod sursa(job #2181860)

Utilizator felipeGFilipGherman felipeG Data 21 martie 2018 21:32:53
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>
#include <stdlib.h>
#define Nmax 100001

int v[ Nmax * 4 + 100 ], n, m, a, b, maxi, val, pos;

int max( int x1, int x2 )
{
    return x1 > x2 ? x1 : x2;
}

void Update( int node, int left, int right )
{
    if ( left == right )
    {
        v[ node ] = val;
        return;
    }
    int mid = (right + left) / 2;
    if ( pos <= mid )
        Update( 2 * node, left, mid );
    else
        Update( 2 * node + 1, mid + 1, right );
    v[ node ] = max(v[ node * 2 + 1 ], v[ node * 2 ]);
}

void Query( int node, int left, int right )
{
    if ( a <= left && right <= b )
    {
        if ( maxi < v[ node ] )
            maxi = v[ node ];
        return;
    }

    int mid = (right + left) / 2;
    if ( a <= mid )Query( 2 * node, left, mid );
    if ( mid < b )Query( 2 * node + 1, mid + 1, right );
}

int main()
{
    int i = 1, x, mod;

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

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

    while ( i <= n )
    {
        fscanf( f, "%d", &x );
        pos = i;
        val = x;

        Update( 1, 1, n );
        i ++;
    }

    i = 1;
    while ( i <= m )
    {
        fscanf( f, "%d%d%d", &mod, &a, &b );

        if ( mod == 1 )
        {
            pos = a;
            val = b;
            Update( 1, 1, n );
        }
        else
        {
            maxi = -1;
            Query( 1, 1, n );
            fprintf( g, "%d\n", maxi );
        }
        i++;
    }

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