Cod sursa(job #2657384)

Utilizator Maria23Dutu Maria Maria23 Data 10 octombrie 2020 14:00:09
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>

using namespace std;

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

vector<int> tree(4e5, 0);


void update(int node, int st, int dr, const int poz, const int val)
{
    if(st == dr)
    {
        tree[node] = val;
        return;
    }
    int mid = (st + dr) / 2;
    if(poz <= mid)
        update(node * 2, st, mid, poz, val);
    else
        update(node * 2 + 1, mid + 1, dr, poz, val);
    tree[node] = max(tree[node * 2], tree[node * 2 + 1]);

}

int query(int node, int st, int dr, const int Qst, const int Qdr)
{
    if(Qst <= st && dr <= Qdr)
        return tree[node];
    int mid = (st + dr) / 2;
    int ans = 0;

    if(Qst <= mid)
        ans = max(ans, query(node * 2, st, mid, Qst, Qdr));
    if(Qdr > mid)
        ans = max(ans, query(node * 2 + 1, mid + 1, dr, Qst, Qdr));
    return ans;

}

int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; ++ i) {
		int x;
		cin >> x;
		update(1, 1, n, i, x);
	}
	while (m --) {
		int tip;
		cin >> tip;
		if (tip == 0) {
			int st, dr;
			cin >> st >> dr;
			cout << query(1, 1, n, st, dr) << '\n';
		}
		else {
			int pos, val;
			cin >> pos >> val;
			update(1, 1, n, pos, val);
		}
	}
    return 0;
}