Cod sursa(job #2861293)

Utilizator DooMeDCristian Alexutan DooMeD Data 3 martie 2022 19:52:19
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;

vector<int> t(4*nmax+5);
int v[nmax+5];

void build(int node, int left, int right) {
	if(left==right) {
		t[node] = v[left];
		return ;
	}
	int mid = (left + right) / 2;
	build(node*2,left,mid);
	build(node*2+1,mid+1,right);
	t[node] = max(t[node*2], t[node*2+1]);
}

void update(int node, int left, int right, int poz, int val) {
	if(left==right) {
		t[node] = val;
		return ;
	}
	int mid = (left + right) / 2;
	if(mid>=poz) update(node*2,left,mid,poz,val);
	if(mid<poz) update(node*2+1,mid+1,right,poz,val);
	t[node] = max(t[node*2], t[node*2+1]);
}

int query(int node, int left, int right, int st, int dr) {
	if(st<=left and right<=dr) 
		return t[node];
	int rez = 0;
	int mid = (left + right) / 2;
	if(mid>=st) rez = max(rez,query(node*2,left,mid,st,dr));
	if(mid<dr) rez = max(rez,query(node*2+1,mid+1,right,st,dr));
	return rez;
}

int main() {
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	
	int n,m; f >> n >> m;
	for(int i=1; i<=n; i++) f >> v[i];
	build(1,1,n);
	for(int i=1; i<=m; i++) {
		int op, x, y; f >> op >> x >> y;
		if(op==0) g << query(1,1,n,x,y) << "\n";
		else update(1,1,n,x,y);
	}
	return 0;
}