Cod sursa(job #2221441)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 14 iulie 2018 12:49:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>
#include<cstring>
using namespace std;

int n,m,a,b;
int aint[400005], aux[100005];

void init(int nod, int l, int r) {
  if (l==r) aint[nod]=aux[l];
  else {
     int mid=(l+r)/2;
     
     init(2*nod,l,mid);
     init(2*nod+1,mid+1,r);
     
     aint[nod]=max(aint[2*nod],aint[2*nod+1]);
  }
	
}

void update(int nod, int l, int r) {
   if (l==r) aint[nod]=b;
   else {
      int mid=(l+r)/2;
   
      if (a<=mid) update(2*nod,l,mid);
      else update(2*nod+1,mid+1,r);
      
      aint[nod]=max(aint[2*nod],aint[2*nod+1]);
   }
	
}

int query(int nod, int l, int r) {
   if (l>=a && r<=b) return aint[nod];
   else {
      int mid=(l+r)/2;
      int m1 = 0, m2=0;
      
      if (a<=mid) m1=query(2*nod,l,mid);
      if (b>mid) m2=query(2*nod+1,mid+1,r);
   
      return max(m1,m2);
   }
	
	
}

int main(void) {
    ifstream cin("arbint.in");
	ofstream cout("arbint.out");	
	
	cin>>n>>m;
	for (int i=1; i<=n; ++i) cin>>aux[i];
	
	init(1,1,n);
	
	for (int i=1; i<=m; ++i) {
	    int op;
		cin>>op>>a>>b;	
	 	
	 	if (op==0) cout<<query(1,1,n)<<"\n";
	 	else update(1,1,n);
	}
	
	return 0;
}