Cod sursa(job #2683516)

Utilizator cyg_TheoPruteanu Theodor cyg_Theo Data 11 decembrie 2020 16:00:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>

using namespace std;

const int NMAX = 100000 + 5; //10^5

const int INF = 1e9;
const double eps = 1e-9;

#define fileI freopen(".in","r",stdin);
#define fileO freopen(".out","w",stdout);
#define IO(name) \
	freopen(name".in","r",stdin); \
	freopen(name".out","w",stdout);

int v[NMAX];
int arbint[4*NMAX];

void update(int node, int l, int r, int pos, int value){
	if(l == r){
		arbint[node] = value;
		return;
	}

	int mid = (r - l)/2 + l; //(r+l)/2

	if(pos <= mid)
		update((node<<1), l, mid, pos, value);
	else
		update((node<<1)+1, mid+1, r, pos, value);

	//default operation = max
	
	arbint[node] = max(arbint[node<<1],arbint[(node<<1)+1]);
}

//value of arbint on [a,b] interval
int query(int node, int l, int r, int a, int b){
	if(a<= l && r<=b)
		return arbint[node];

	int mid = (r - l)/2 + l; //(r+l)/2
	
	//default operation = max

	int maxim = -1;

	if(a <= mid)
		maxim = max(maxim, query(node<<1, l, mid, a, b));
	if(mid < b)
		maxim = max(maxim, query((node<<1)+1, mid+1, r, a, b));

	return maxim;
}

void solve();

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int t;

	t = 1;
	//scanf("%d",&t);

	for(;t;t--){
		solve();
	}

	return 0;
}

void solve(){
	IO("arbint");

	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%d",&v[i]);
		update(1,1,n,i,v[i]);
	}	

	int q,a,b;
	for(int i=1;i<=m;++i){
		scanf("%d%d%d",&q,&a,&b);

		if(q==0)
			printf("%d\n",query(1,1,n,a,b));
		else
			update(1,1,n,a,b);
			
	}

}