Cod sursa(job #767630)

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

using namespace std;

int v[600070];
int n,rez,p;
void actualizare ( int , int  , int , int);
void interogare ( int , int ,int , int ,int );
int main()
{
    ifstream fin ("arbint.in");
	freopen ("arbint.out","w",stdout);
    int i,y,m;
    int j,k,l,maxim;
    fin>>n>>m;
    for (i=1;i<=n;i++)
    {
        fin>>y;
        p=i;
		actualizare(1,1,n,y);
    }
    for ( i=0;i<m;i++)
    {
        fin>>j>>k>>l;
        if ( j )
        {
            p=k;
			actualizare(1,1,n,l);
        }
        else
        {
            rez=-1;
			interogare(1,1,n,k,l);
            printf("%d",rez);

            printf("\n");

        }
    }

    fin.close();
    //fout.close();
    return 0;
}


void actualizare (int poz,int stg,int dr,int x)
{
    int mid;
    if (stg==dr)
    {
        v[poz]=x;
        return;
    }
	mid=(stg+dr)/2;
	if ( p<=mid )
		actualizare (2*poz,stg,mid,x);
	else
		actualizare (2*poz+1,mid+1,dr,x);
	if (v[2*poz]>v[2*poz+1] )
		v[poz]=v[2*poz];
	else
		v[poz]=v[2*poz+1];
 }

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