Cod sursa(job #544265)

Utilizator Ast09Stoica Anca Ast09 Data 1 martie 2011 12:38:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream.h>
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M,MaxArb[400071],val,pos,maxim,a,b;
inline int Maxim(int a,int b)
{ if(a>b) return a;
  return b;
}
void update(int,int,int);
void query(int,int,int);

int main()
{ int x,i;
  f>>N>>M;
  for(i=1;i<=N;i++)
	  { f>>x;
	    pos=i; val=x;
		update(1,1,N);
	  }
  for(i=1;i<=M;i++)
	  { f>>x>>a>>b;
	    if(0==x) 
			{ maxim=-1;
			  //start=a; finish=b;
			  query(1,1,N);
			  g<<maxim<<'\n';
			}
			else {pos=a; val=b;
				  update(1,1,N);
				 }
	  }
  f.close(); g.close();
  return 0;
}

void update(int x,int st,int dr)
{ if(st==dr)
	{ MaxArb[x]=val; return; }
  int m=(st+dr)/2;
  if(pos<=m) update(2*x,st,m);
	  else   update(2*x+1,m+1,dr);
  MaxArb[x]=Maxim(MaxArb[2*x],MaxArb[2*x+1]);
}

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