Cod sursa(job #2491721)

Utilizator horiainfoTurcuman Horia horiainfo Data 13 noiembrie 2019 00:03:19
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

#define N 400005
using namespace std;

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

int n, m;
int g[N], lazy[N];

void shift(int node){
	if(lazy[node] == -1) 	return;
	g[node] 				= lazy[node];
	
	if(node * 2 + 1 < N)		// the lazy value has to be margeable
		lazy[node * 2] 		=
		lazy[node * 2 + 1] 	= lazy[node];

	lazy[node] 				= -1;
}

void update(int val, int L, int R, int node = 1, int l = 1, int r = n){
	shift(node);
	if(L <= l && r <= R){
		lazy[node] = val;
		shift(node);
		return;
	}
	
	if(l > R || r < L) return;

	int mij = (l + r) / 2;
	update(val, L, R, node * 2, l, mij);
	update(val, L, R, node * 2 + 1, mij + 1, r);

	g[node] = max(g[node * 2], g[node * 2 + 1]);
}

int query(int L, int R, int node = 1, int l = 1, int r = n){
	shift(node);
	if(L <= l && r <= R)	return g[node];
	
	int mij = (l + r) / 2;
	if(l > R || r < L) return -1;

	return max(	query(L, R, node * 2, l, mij), 
				query(L, R, node * 2 + 1, mij + 1, r));
}

int main(){
	int a, b, op, val;
	fin >> n >> m;
	for(int i = 1; i < N; i ++)
		lazy[i] = -1;

	for (int i = 1; i <= n; i++){
		fin >> val;
		update(val, i, i);
	}
	
	for (int i = 1; i <= m; i++){
		fin >> op >> a >> b;
		if (op)
			update(b, a, a);
		else
			fout << query(a, b) << '\n';
	}
	return 0;
}