Cod sursa(job #1251126)

Utilizator bulbulicaAlexandrescu Cristian bulbulica Data 28 octombrie 2014 23:10:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#define Nmax 450010
#define maximum(X,Y) ((X) > (Y) ? (X) : (Y) )
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int aux[Nmax],n,m;

void actualizare(int nod,int st, int dr,int val,int poz)
{
    if (st==dr)
	{
        aux[nod]=val;
		return;
	}
	int mij=(st+dr)/2;
	if (poz<=mij)
		actualizare(2*nod,st,mij,val,poz);
	else
		actualizare(2*nod+1,mij+1,dr,val,poz);
	aux[nod]=maximum(aux[2*nod],aux[2*nod+1]);
}
void interogare(int nod,int st,int dr,int inceput,int final,int &max)
{
    if (inceput<=st && final>=dr)
	{
        if (max<aux[nod])
            max=aux[nod];
		return;
	}
	int mij =(st+dr)/2;
	if (inceput<=mij)
		interogare(2*nod,st,mij,inceput,final,max);
	if (mij<final)
		interogare(2*nod+1,mij+1,dr,inceput,final,max);

}
int main()
{
    int nr,operatie,val1,val2,max_nr=0,pozitie,valoare;
    f>>n>>m;
    for (int i=1;i<=n;++i)
    {
        f>>nr;
        pozitie=i;
        valoare=nr;
        actualizare(1,1,n,valoare,pozitie);
    }
    for (int i=1;i<=m;++i)
    {
        f>>operatie>>val1>>val2;
        if (operatie)
        {
            pozitie=val1;
            valoare=val2;
            actualizare(1,1,n,valoare,pozitie);
        }
        else
        {
            max_nr=-999999;
            interogare(1,1,n,val1,val2,max_nr);
            g<<max_nr<<'\n';
        }
    }
    return 0;
}