Cod sursa(job #2693770)

Utilizator mex7Alexandru Valentin mex7 Data 6 ianuarie 2021 22:36:33
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
#define ll long long
#define cin fin
#define cout fout
using namespace std;
	
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, v[100005], rasp[400099];
int wantLeft, wantRight, wantVal, wantNode, queryAns = 0;

void update(int node, int left, int right) {
	if (left == right) {
		rasp[node] = wantVal;
		return;
	}

	int mid = (left + right) / 2;
	if (wantNode <= mid)
		update(2 * node, left, mid);
	else
		update(2 * node + 1, mid + 1, right);

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

void computeRes(int node, int left, int right) {
	if (wantLeft <= left && right <= wantRight) {
		queryAns = max(queryAns, rasp[node]);
		return;
	}
	if (left == right)
		return;

	int mid = (left + right) / 2;
	computeRes(2 * node, left, mid);
	computeRes(2 * node + 1, mid + 1, right);
}

int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> v[i];

		wantVal = v[i];
		wantNode = i;
		update(1, 1, n);
	}

	for (int query = 1; query <= m; query++) {
		int type;

		cin >> type;
		if (type) {
			cin >> wantNode >> wantVal;
			update(1, 1, n);
		} else {
			queryAns = 0;
			cin >> wantLeft >> wantRight;
			computeRes(1, 1, n);
			cout << queryAns << '\n';
		}
	}

 
	return 0;
}