Cod sursa(job #3157597)

Utilizator Luca07Nicolae Luca Luca07 Data 16 octombrie 2023 09:06:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#include<vector>
#include<queue>
using namespace std;

#define ll long long


ifstream cin("arbint.in");
ofstream cout("arbint.out");

struct Node {
	ll l, r;
	ll value = 0;
	Node* leftNode = NULL;
	Node* rightNode = NULL;

	Node(ll l1, ll r1) : l(l1), r(r1) {}

	void update(ll pos, ll nr) {
		if (l == r) {
			value = nr;
			return;
		}

		ll m = (l + r) / 2;
		if (pos <= m) {
			if (leftNode == NULL) {
				leftNode = new Node(l, m);
			}
			leftNode->update(pos, nr);
		}
		else {
			if (rightNode == NULL) {
				rightNode = new Node(m + 1, r);
			}
			rightNode->update(pos, nr);
		}
		value = 0;
		if (leftNode != NULL) {
			value =max(value, leftNode->value);
		}
		if (rightNode != NULL) {
			value =max(value, rightNode->value);
		}
	}

	ll query(ll st, ll end) {
		if (st <= l && r <= end) {
			return value;
		}
		ll m = (l + r) / 2;
		ll res = 0;
		if (st <= m) {
			if (leftNode != NULL)
				res = max(res, leftNode->query(st, end));
		}
		if (end > m) {
			if (rightNode != NULL)
				res =max(res, rightNode->query(st, end));
		}
		return res;
	}
};

Node* root;

void build(Node*& root, ll n) {
	root = new Node((ll)1, n);
	queue<Node*> q;
	q.push(root);
	while (!q.empty()) {
		auto node = q.front();
		q.pop();
		if (node->l == node->r)
			continue;
		ll m = (node->l + node->r) / 2;
		node->leftNode = new Node(node->l, m);
		node->rightNode = new Node(m + 1, node->r);
		q.push(node->leftNode);
		q.push(node->rightNode);
	}
}


int main()
{
	ll i, j, n,m,c, a, b;

	cin >> n >> m;
	build(root, n);

	for (i = 0; i < n; i++) {
		cin >> a;
		root->update(i + 1, a);
	}

	while (m) {
		cin >>c>> a >> b;
		if (c) {
			root->update(a, b);
		}
		else {
			cout << root->query(a, b)<<"\n";
		}
		m--;
	}

	return 0;
}