Cod sursa(job #1046507)

Utilizator tavi.belu1994FMI Belu Andrei Octavian tavi.belu1994 Data 2 decembrie 2013 23:31:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
FILE *f,*g;
using namespace std;

int N,M,Arb[400000],start,finish,Val,Pos,maxim;

void Update(int nod, int left, int right)
{
    if ( left == right )
    {
        Arb[nod] = Val;
        return;
    }
    int mid = (left+right)/2;
    if ( Pos <= mid )
    {
        Update(2*nod,left,mid);
    }
    else
    {
    Update(2*nod+1,mid+1,right);
    }
    Arb[nod] = max( Arb[2*nod], Arb[2*nod+1] );
}

void Query(int nod, int left, int right)
{
    if ( start <= left && right <= finish )
    {
        if ( maxim < Arb[nod] )
        {
            maxim = Arb[nod];
        }
        return;
    }
    int mid = (left+right)/2;
    if ( start <= mid )
    {
        Query(2*nod,left,mid);
    }
    if ( mid < finish )
    {
        Query(2*nod+1,mid+1,right);
    }
}

int main()
{
    f=fopen("arbint.in","r");
    g=fopen("arbint.out","w");
    int x,a,b,i;
    fscanf(f,"%d %d",&N,&M);
    for(i=1 ; i<=N ; i++)
    {
        fscanf(f,"%d",&x);
        Pos = i;
        Val = x;
        Update(1,1,N);
    }
    for(i=1 ; i<=M ; i++)
    {
        fscanf(f,"%d %d %d", &x, &a, &b);
        if ( x == 0 )
        {
             maxim = -1;
             start = a;
             finish = b;
             Query(1,1,N);
             fprintf(g,"%d\n",maxim);
        }
        else
        {
            Pos = a;
            Val = b;
            Update(1,1,N);
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}