Cod sursa(job #767631)

Utilizator bratualexBratu Alexandru bratualex Data 14 iulie 2012 00:47:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>

using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int v[600070],rez,n,k,i,x,y,z;
void actualizare ( int ,int,int,int,int);
void interogare (int , int ,int ,int ,int);
int main()
{
    //int
    fin>>n>>k;
    for (i=1;i<=n;i++)
    {
        fin>>x;
        actualizare (1,x,1,n,i);
    }
    for (i=0;i<k;i++)
    {
        fin>>z>>x>>y;
        if (z)
        {
            actualizare (1,y,1,n,x);
        }
        else
        {
            interogare (1,1,n,x,y);
            fout<<rez<<"\n";
            rez=-1;
        }
    }
    return 0;
}

void actualizare ( int i ,int inf,int st,int dr,int a)
{
    if (st==dr)
    {

        v[i]=inf;
        return;
    }
    else
    {
        int mijl=(dr+st)/2;
        if (a<=mijl)
            actualizare (2*i,inf,st,mijl,a);
        else
            actualizare (2*i+1,inf,mijl+1,dr,a);
        v[i]=max(v[2*i],v[i*2+1]);


    }
}

void interogare (int i , int st, int dr , int a, int b)
{
    if (a<=st && dr<=b )
    {
        if ( v[i]>rez )
        rez=v[i];
        return;
    }
    else
    {
        int mid = (dr+st)/2;
        if (a<=mid )
            interogare (i*2,st,mid,a,b);
        if (b>mid)
            interogare (i*2+1,mid+1,dr,a,b);

    }
}