Cod sursa(job #2182465)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 22 martie 2018 13:22:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <algorithm>
using namespace std;

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

const int Dim = 100001;
int Tree[Dim * 4],ma;

void Update(int node , int le , int ri ,int pos, int val );
void Query(int node, int le , int ri , int a ,int b);

int main() {
	
	int n,x,m,task,y;
	fin >> n >> m;
	for ( int i = 1; i <= n; ++i) {
		fin >> x;
		Update(1,1,n,i,x);
	}
	for ( int i = 1; i <= m; ++i) {
		fin >> task >> x >> y;
		if ( task == 0) {
			ma = 0;
			Query(1,1,n,x, y);
			fout << ma << "\n";
			}
		else Update(1,1,n,x,y);
		}
}

void Update(int node , int le , int ri ,int pos, int val ){
	
	if ( le == ri ) {
		Tree[node] = val;
		return;	
		}
	int mj = ( le  + ri ) / 2;
	if ( pos <= mj)
		Update(node * 2, le , mj  , pos , val);
	else 	Update(node * 2 + 1, mj + 1 , ri , pos , val);
	Tree[node] = max(Tree[node * 2] , Tree[node * 2 + 1]);
}

void Query(int node, int le , int ri , int a ,int b) {
	
	if ( a <= le and b >= ri ) {
		ma = max ( Tree[node] , ma);
		return;
		}
	int mj = ( le + ri) / 2;
	if ( a <= mj)
		Query(node * 2 , le , mj , a , b);
	if ( b > mj )
		Query(node * 2 + 1, mj + 1, ri , a , b);
}