Cod sursa(job #2651368)

Utilizator ViAlexVisan Alexandru ViAlex Data 22 septembrie 2020 14:35:32
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include<iostream>
#include<fstream>
using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

#define MAXNODES 100000


int tree[3*MAXNODES],values[MAXNODES],num_nodes,num_queries;


inline int middle(int left,int right){
	return (left+right)/2;
}

void build_tree(int left,int right,int index){
	if(left==right){
		tree[index]=values[left];
	}
	else{
		int mid=middle(left,right);
		build_tree(left,mid,index*2);
		build_tree(mid+1,right,index*2+1);

		tree[index]=max(tree[index*2],tree[index*2+1]);
	}

}

int query(int left,int right,int a,int b,int index){
	if(left>=a && right<=b){
		return tree[index];
	}

	int mid=middle(left,right);
	int result=-1;
	if(a<=mid){
		result=max(result,query(left,mid,a,b,index*2));
	}
	if(b>mid){
		result=max(result,query(mid+1,right,a,b,index*2+1));
	}
	return result;
}



void modify(int left,int right,int position,int value,int index){
	if(left==right){
		tree[index]=value;
	}
	else{
		int mid=middle(left,right);
		if(position<=mid){
			modify(left,mid,position,value,index*2);
		}
		else modify(mid+1,right,position,value,index*2+1);
		tree[index]=max(tree[index*2],tree[index*2+1]);
	}


}



void read(){
	in>>num_nodes>>num_queries;
	for(int i=0;i<num_nodes;i++){
		in>>values[i];
	}
}



void solve(){
	build_tree(0,num_nodes-1,1);
	int a,b,c;
	for(int i=0;i<num_queries;i++){
		in>>a>>b>>c;
		if(a==0){
			out<<query(0,num_nodes-1,b-1,c-1,1)<<'\n';
		}
		else{
			modify(0,num_nodes-1,b-1,c,1);	
		}
	}


}




int main(){
	read();
	solve();
	return 0;
}