Cod sursa(job #1970355)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 19 aprilie 2017 11:45:29
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using pii = pair<int, int>;
#define dbg(x) cerr<<#x": "<<(x)<<'\n'
#define dbg_v(x, n) cerr<<#x"[]: ";for(long long _=0;_<n;++_)cerr<<(x)[_]<<' ';cerr<<'\n'
#define all(v) v.begin(), v.end()
#define NMAX 100010

int st[2 * NMAX], n;

void build()
{
	for(int i = n - 1; i >= 1; --i)
		st[i] = max(st[i << 1], st[i << 1 | 1]);
}

int query(int l, int r)
{
	++r;

	int res;
	for(res = -1, l += n, r += n; l < r; l >>= 1, r >>= 1)
	{
		if(l & 1) res = max(res, st[l]), ++l;
		if(r & 1) --r, res = max(res, st[r]);
	}

	return res;
}

void update(int pos, int val)
{
	for(st[pos += n] = val; pos > 1; pos >>= 1)
		st[pos >> 1] = max(st[pos], st[pos ^ 1]);
}

int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	ios_base::sync_with_stdio(false);

	int i, m, type, a, b;

	scanf("%d %d", &n, &m);
	for(i = 0; i < n; ++i) scanf("%d", &st[i + n]);
	build();

	while(m--)
	{
		scanf("%d %d %d", &type, &a, &b);

		if(type == 0) printf("%d\n", query(a - 1, b - 1));
		else update(a - 1, b);
	}

	return 0;
}