Cod sursa(job #591216)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 23 mai 2011 10:41:19
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
# include <cstdio>
using namespace std;

int H[300000], n, m, v[100000];

inline int maxim (int a, int b){
	if (a > b) return a;
	return b;
}

inline void update (int node, int left, int right, int i, int v){
	if (left >= right){
		H[node] = v;
		return ;
	}
	
	int middle = (left + right) >> 1;
	
	if (i <= middle)
		update (2 * node, left, middle, i, v);
	else
		update (2 * node + 1, middle + 1, right, i, v);
	
	H[node] = maxim (H[2 * node], H[2 * node + 1]);
}













inline void update2 (int st, int dr, int i, int val, int node){
	if (st >= dr){
		H[node] = val;
		return ;
	}
	
	int m = (st + dr) >> 1;
	
	if (i <= m)
		update2 (st, m, i, val, (node << 1));
	else
		update2 (m + 1, dr, i, val, (node << 1) + 1);
	
	H[node] = maxim (H[node << 1], H[(node << 1) + 1]);
}




inline int query (int i, int j, int node, int st, int dr){
	if (i <= st && dr <= j) return H[node];
	
	int m = (st + dr) >> 1;
	int sol = 0;
	
	if (i <= m)
		sol = maxim (sol, query (i, j, node << 1, st, m));
	if (j > m)
		sol = maxim (sol, query (i, j, (node << 1) + 1, m + 1, dr));
	
	return sol;
}





int i, Q, st, dr;
int main (){
	freopen ("arbint.in", "r", stdin);
	freopen ("arbint.out", "w", stdout);
	
	scanf ("%d%d", &n, &m);
	
	for (i = 1; i <= n; ++i){
		scanf ("%d", &v[i]);
		
		update2 (1, n, i, v[i], 1);
	}
	
	for (; m > 0; --m){
		scanf ("%d%d%d", &Q, &st, &dr);
		if (Q == 0)
			printf ("%d\n", query (st, dr, 1, 1, n));
		else
			update2 (1, n, st, dr, 1);
	}
	return 0;
}