Cod sursa(job #2845768)

Utilizator paisieRusu Paisie paisie Data 8 februarie 2022 12:06:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define pair<int, int> pi
#define mp make_pair
#define forr(X) for(int i = 0; i<X; i++)
#pragma GCC optimize("Ofast")
#define F first
#define all(X) X.begin(), X.end()
#define S second
//#define int ll
#define out(X) for(auto it: X){ for(auto ito : it)cout<<ito<<" "; cout<<endl;}
//#define MOD 1000000000000000031

int a[100000], n, m; 
int c, x, y;

int mid(int start, int end){
	return(start+(end-start)/2);
}

int construct(int st, int end, int *tree, int in){
	if(st==end){
		tree[in]=a[st];
		return tree[in];
	}
	int mi = mid(st, end);
	tree[in] = max(construct(st, mi, tree, in*2+1), construct(mi+1, end, tree, in*2+2));
	return tree[in];
}

int maxt(int st, int end, int *tree, int in){
	if(x>end || y<st){
		return 0;
	}
	if(x<=st && y>=end){
		return tree[in];
	}
	int mi = mid(st, end);
	return max(maxt(st, mi, tree, in*2+1), maxt(mi+1, end, tree, in*2+2));
}

int updt(int st, int end, int *tree, int in){
	if(st==end){
		tree[in]=y;
		return tree[in];
	}
	int mi = mid(st, end);
	if(x<=mi){
		tree[in] = max(tree[in*2+2], updt(st, mi, tree, in*2+1));
	}
	else{
		tree[in] = max(tree[in*2+1], updt(mi+1, end, tree, in*2+2));
	}
	return tree[in];
	
}

void solve(){
	cin>>n>>m;
	forr(n){
		scanf("%d", &a[i]);
	}
	
	int treel;
	treel = int(pow(2, (int(ceil(log2(n)))+1))-1);
	int tree[treel];
	construct(0, n-1, tree, 0);
	
	forr(m){
		//cin>>c>>x>>y;
		scanf("%d %d %d", &c, &x, &y);
		if(c==0){
			x--;
			y--;//0-indexed
			//cout<<maxt(0, n-1, tree, 0)<<endl;
			printf("%d\n", maxt(0, n-1, tree, 0));
		}
		else{
			x--;
			updt(0, n-1, tree, 0);
		}
	}
	
}

int32_t main(){
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	//int t;cin>>t;while(t--)
	solve();
}