Cod sursa(job #2065206)

Utilizator flibiaVisanu Cristian flibia Data 13 noiembrie 2017 16:23:56
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;

int n, m, a[100100], sz, nr, block[1010], cod, x, y;  

void build(){
	int st = 1, dr = sz, rs;
	while(dr <= n){
		rs = 0;
		for(int i = st; i <= dr; i++)
			rs = max(rs, a[i]);
		block[++nr] = rs;
		st = dr + 1;
		dr += sz;
	}
}

int solve(int st, int dr){
	int p = st, rs = 0, cur;
	while(p % sz != 1 && p <= dr)	
		rs = max(a[p++], rs);
	cur = p / sz + 1;
	while(p + sz - 1 <= dr){
		rs = max(block[cur], rs);
		p += sz;
		cur++;
	}
	while(p <= dr)
		rs = max(a[p++], rs);
	return rs;
}	

void update(int x, int y){
	a[x] = y;
	int p = x / sz + ((x % sz) != 0);
	int rs = 0, st = (p - 1) * sz + 1, dr = min(st + sz, n + 1);
	for(int i = st; i < dr; i++)
		rs = max(rs, a[i]);
	block[p] = rs;
}

int main(){
	ifstream in("arbint.in");
	ofstream out("arbint.out");
	in >> n >> m;
	for(int i = 1; i <= n; i++)	
		in >> a[i];
	sz = int(sqrt(n));
	build();
	for(int i = 1; i <= m; i++){
		in >> cod >> x >> y;
		if(cod)
			update(x, y);
		else
			out << solve(x, y) << '\n';
	}
	return 0;		
}