Cod sursa(job #856795)

Utilizator TripluYOlteanu Costin TripluY Data 16 ianuarie 2013 22:50:43
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<fstream>
using namespace std;

int *arb,maxim,pozitie,a,b,n,valoare;

void update (int nod,int stanga,int dreapta)
{
	if (stanga == dreapta)
    {
        arb[nod] = valoare;
        return;
    }

    int mijloc = (stanga + dreapta) >> 1,nod_sub=nod << 1;
    if (pozitie <= mijloc)
        update(nod_sub,stanga,mijloc);
    else
        update(nod_sub+1,mijloc+1,dreapta);
    arb[nod] = arb[nod_sub];
    if(arb[nod] < arb[nod_sub+1])
        arb[nod] = arb[nod_sub+1];
}

void query (int nod,int stanga,int dreapta)
{
	if ((a <= stanga) && (dreapta <= b))
	{
	    if(maxim < arb[nod])
            maxim = arb[nod];
        return;
    }

	int mijloc = (stanga + dreapta) >> 1,nod_sub = nod << 1;
	 if (a <= mijloc)
        query(nod_sub,stanga,mijloc);
	 if (mijloc < b)
        query(nod_sub+1,mijloc+1,dreapta);

}

int main()
{
    ifstream f("arbint.in");
	int m;
	f >> n >> m;
	arb = new int[(n << 2) + 1];
	int i;
	for (i=1;i<=n;++i)
    {
        f >> valoare;
        pozitie = i;
        update(1,1,n);
    }

    int operatie;
    ofstream g("arbint.out");
	for (i=1;i<=m;++i)
	{
		f >> operatie >> a >> b;

        if (operatie == 0)
		{
			maxim = -1;
			query(1,1,n);
			g<<maxim<<endl;
		}
		else
		{
			pozitie = a;
			valoare = b;
			update(1,1,n);
		}
	}
    f.close();
    g.close();
    delete []arb;
    return 0;
}