Cod sursa(job #222073)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 19 noiembrie 2008 20:56:59
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream.h>


long v[100005], a[270000];

void constr (int nod, int st, int dr, int b, int val)
     {
	    if (st>=dr) v[nod]=val;
	       else
	       {
		    if (b<=(st+dr)/2) constr(2*nod,st,(st+dr)/2,b,val);
		    if (b>(st+dr)/2) constr(2*nod+1,(st+dr)/2+1,dr,b,val);
		    if (v[nod*2+1]<v[2*nod]) v[nod]=v[2*nod];
					else v[nod]=v[nod*2+1];
	       }
     }

int max (int st, int  dr, int b1, int b2,int nod)
	{
		if (b1<=st && dr<=b2) return v[nod];
			else
			{
			       long mij=(st+dr)/2;
			       long max1=0, max2=0;
				if (b1<=mij) max1=max(st,mij,b1,b2,2*nod);
				if (b2>mij) max2=max(mij+1,dr,b1,b2,2*nod+1);
				if (max1<max2) return max2;
					else return max1;
			}
	}

int main()
{
    long n,i,m,nr,val;
    ifstream f ("arbint.in");
    f>>n>>m;
    for (i=1;i<=n;i++)
    {
	f>>val;
	constr(1,1,n,i,val);
    }
    ofstream g("arbint.out");
    long a1,b;
    for (i=1;i<=m;i++)
    {
	f>>nr>>a1>>b;
	if (nr==1) constr(1,1,n,a1,b);
	   else g<<max(1,n,a1,b,1)<<'\n';
    }
    f.close();
    g.close();
    return 0;
}