Cod sursa(job #825862)

Utilizator chimistuFMI Stirb Andrei chimistu Data 29 noiembrie 2012 19:16:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#include <cstdlib>

FILE*f=fopen("arbint.in","r");
FILE*g=fopen("arbint.out","w");
int n,arb[300000],m,val,pos,maxim,a,b;
int max(int a,int b)
{
	if (a>b)
		return a;
	return b;
}

void update(int nod,int st,int dr)
{
	int mij;
	if (st==dr)
	{
		arb[nod]=val;
		return;}
	mij=(st+dr)/2;
	if (pos<=mij)
		update(2*nod,st,mij);
	else
		update(2*nod+1,mij+1,dr);
	arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}

void query(int nod,int st,int dr)
{
     int mij;
    if ((a<=st) && (dr<=b))
    {
       if (maxim<arb[nod])
          maxim=arb[nod];
       return;}
    mij=(st+dr)/2;
    if (a<=mij)
       query(2*nod,st,mij);
    if (mij<b)
       query(2*nod+1,mij+1,dr);
}

int main()
{
	int x,i,tip;
	fscanf(f,"%d%d",&n,&m);
	for (i=1;i<=n;i++)
	{
		fscanf(f,"%d",&x);
		pos=i;val=x;
		update(1,1,n);
	}
	for (i=1;i<=m;i++)
	{
		fscanf(f,"%d",&tip);
		switch(tip){
	case 0:{fscanf(f,"%d%d",&a,&b);maxim=-1;query(1,1,n);fprintf(g,"%d \n",maxim);break;}
	case 1:{fscanf(f,"%d%d",&a,&b);pos=a;val=b;update(1,1,n);break;}
		}
	}
	return 0;
}