Cod sursa(job #2140643)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 23 februarie 2018 18:59:06
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

#define dbg(x) cerr<<#x": "<<x<<"\n"
#define dbg_p(x) cerr<<#x": "<<x.first<<","<<x.second<<"\n"
#define dbg_v(x, n) do{cerr<<#x"[]: ";for(int _=0;_<n;++_)cerr<<x[_]<<" ";cerr<<'\n';}while(0)
#define dbg_ok cerr<<"OK!\n"

#define st first
#define nd second

#define DMAX 
#define NMAX 
#define MMAX 

using namespace std;

int n, k, x,m, v[100004], arb[400004], op, a, b;
string s;

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

void update(int nod, int pos, int val, int left, int right)
{
	if(left == right) {
		arb[nod] = val;
		return;
	}
	int mid=(left+right)/2;
	if (pos<=mid)
		update(2*nod, pos, val, left,mid);
	else update(2*nod+1, pos, val, mid+1, right);
	arb[nod]=max(arb[2 * nod], arb[2 * nod + 1]);
}

int query(int nod, int a, int b, int left, int right)
{
	if (left>=a&&right<=b)
		return arb[nod];
	int mid= (left+right)/2;
	int ansl=000000000;
	int ansr=000000000;
	if (a<=mid)
		ansl=query(2*nod, a, b, left, mid);
	if (b>=mid+1)
		ansr=query(2*nod+1, a, b, mid+1, right);
	return max(ansl, ansr);
}

int main()
{
	ios_base::sync_with_stdio(false);
	fin>>n>>m;
	for (int i=1;i<=n;i++)
		fin>>v[i], update(1, i, v[i], 1, n);
	for (int i=1;i<=m;i++)
	{
			fin>>op>>a>>b;
			if (op==1)
				update(1, a, b, 1, n);
			else fout<<query(1, a, b, 1, n)<<'\n';
	}
}