Cod sursa(job #3005362)

Utilizator BadHero112Ursu Vasile BadHero112 Data 16 martie 2023 21:50:59
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
using ll=long long;
#define S second
#define F first
#define endl '\n'
#define spid ios_base::sync_with_stdio(false);cin.tie(NULL);
const int mod=1e9+7;
const double pi=3.14159265359;
const int maxn=100001;
using namespace std;

int q,n,A[maxn],tree[4*maxn];

void build(int l,int r,int i){
	if(l==r){
		tree[i]=A[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,2*i+1);
	build(mid+1,r,2*i+2);
	tree[i]=max(tree[2*i+1],tree[2*i+2]);
}

int que(int ql,int qr,int l,int r,int i){
	if(ql<=l&&qr>=r)return tree[i];
	int left=0;
	int right=0;
	int mid=(l+r)/2;
	if(ql<=mid)left=que(ql,qr,l,mid,2*i+1);
	if(qr>=mid+1)right=que(ql,qr,mid+1,r,2*i+2);
	return max(left,right);
}

void update(int l,int r,int target,int change,int i){
	if(l==r&&l==target){
		A[i]=change;
		tree[i]=change;
		return;
	}
	int left=0;
	int right=0;
	int mid=(l+r)/2;
	if(target>mid){
		left=tree[2*i+1];
		update(mid+1,r,target,change,2*i+2);
		right=tree[2*i+2];
		tree[i]=max(left,right);
	}
	else{
		update(l,mid,target,change,2*i+1);
		left=tree[2*i+1];
		right=tree[2*i+2];
		tree[i]=max(left,right);
	}
}

int main(){
	ifstream cin("arbint.in");
	ofstream cout("arbint.out");
	cin>>n>>q;
	for(int i=0;i<n;i++)cin>>A[i];
	build(0,n-1,0);
	while(q--){
		int c,a,b;
		cin>>c>>a>>b;
		if(c==0){
			a--;
			b--;
			cout<<que(a,b,0,n-1,0)<<endl;
		}
		else update(0,n-1,a-1,b,0);
	}
}