Cod sursa(job #2750990)

Utilizator HadircaDionisieHadirca Dionisie HadircaDionisie Data 13 mai 2021 20:20:21
Problema Planeta Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
// Arbori_noduri_BST_Nebunii.cpp : This file contains the 'main' function. Program execution begins and ends there.
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>


using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m;
int xs[100001], segTree[4 * 100001];

void build(int ind, int st, int dr) {
	if (st == dr) {
		segTree[ind] = xs[st];
		return;
	}

	int mid = (st + dr) / 2;
	build(2 * ind, st, mid);
	build(2 * ind + 1, mid + 1, dr);
	segTree[ind] = max(segTree[2 * ind], segTree[2 * ind + 1]);
}

int query(int ind, int st, int dr, int l, int r) {
	//inclus in interval
	if (st >= l && dr <= r) {
		return segTree[ind];
	}
	//Nu contribue cu nimic la query deci returnam INT_MIN pentru comparatie
	if (dr<l || st>r) {
		return -1;
	}
	//overlaps
	int mid = (st + dr) / 2;
	int left = query(2 * ind, st, mid, l, r);
	int right = query(2 * ind + 1, mid + 1, dr, l, r);
	return max(left, right);
}

void update(int ind, int st, int dr,int val,int pos) {
	if (st == dr) {
		segTree[ind] = val;
		return;
	}
	int mid = (st + dr) / 2;
	if (pos <= mid) {
		update(2 * ind, st, mid, val, pos);
	}
	else {
		update(2 * ind + 1, mid + 1, dr, val, pos);
	}
	segTree[ind] = max(segTree[2 * ind], segTree[2 * ind + 1]);
}
int main()
{

	fin >> n >> m;
	for (int i = 1; i <= n; i++) {
		fin >> xs[i];
	}

	build(1, 1, n);

	int x, a, b;
	for (int i = 0; i < m; i++) {
		fin >> x >> a >> b;
		if (x == 0) {
			fout << query(1, 1, n, a, b)<<'\n';
		}
		else {
			update(1, 1, n, b, a);
		}
	}
	return 0;
}