Cod sursa(job #494005)

Utilizator cosmyoPaunel Cosmin cosmyo Data 20 octombrie 2010 14:15:21
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<fstream>
using namespace std;
const int N=100005;
int init[N],n,m,v[N],p1,p2;

void cstr(int st,int dr,int poz)
{if(st==dr)
  {init[st]=poz;
   return ;
  }
 int mijl=(st+dr)/2;
 cstr(st,mijl,poz*2);
 cstr(mijl+1,dr,poz*2+1);
}

void update(int poz,int val)
{int x=init[poz];
  v[x]=val;
	  for(x/=2;x>0;x/=2)
	 	v[x]=max(v[2*x],v[2*x+1]);
}

int query(int st,int dr,int poz)
{	if(p2<st||p1>dr)
  	 return 0;
  int x;
	if(p1<=st&&dr<=p2)
		return v[poz];

	int mijl=(st+dr)/2;

	return max(query(st,mijl,2*poz),query(mijl+1,dr,2*poz+1));
}

int main()
{ifstream fin("arbint.in");
 ofstream fout("arbint.out");
  fin>>n>>m;
  int i,o,x;
  cstr(1,n,1);

   for(i=1;i<=n;++i)
	   {fin>>x;update(i,x);}





    for(i=1;i<=m;++i)
	    {fin>>o>>p1>>p2;

		  	if(o==0)
				fout<<query(1,n,1)<<'\n';
			else
				update(p1,p2);
		}

   fin.close();
   fout.close();

   return 0;
}