Cod sursa(job #2187176)

Utilizator PruteanuTheoPruteanu Theodor PruteanuTheo Data 26 martie 2018 11:54:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int NMAX=100000;

int v[NMAX+5];
int aint[4*NMAX+5];

void build(int nod, int st, int dr){
	if(st==dr)
		aint[nod]=v[st];
	else
	{
		int med=(st+dr)/2;
		build(nod*2,st,med);
		build(nod*2+1,med+1,dr);
		aint[nod]=max(aint[nod*2],aint[nod*2+1]);
	}
}

void update(int nod, int st, int dr, int pozV, int new_val){
	if(st==dr)
		aint[nod]=new_val;
	else
	{
		int med=(st+dr)/2;
		if(pozV<=med)
			update(2*nod,st,med,pozV,new_val);
		else
			update(2*nod+1,med+1,dr,pozV,new_val);
		aint[nod]=max(aint[2*nod],aint[2*nod+1]);
	}
}

int sol;

void query(int nod, int st, int dr, int a, int b){
	if(a<=st && dr<=b)
		sol=max(sol,aint[nod]);
	else
	{
		int med=(st+dr)/2;
		if(a<=med)
			query(2*nod,st,med,a,b);
		if(b>=med+1)
			query(2*nod+1,med+1,dr,a,b);
	}
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,q;
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;++i)
		scanf("%d",&v[i]);
	build(1,1,n);
	int a,b,c;
	for(int i=1;i<=q;++i)
	{
		scanf("%d%d%d",&c,&a,&b);
		if(c==1){
			v[a]=b;
			update(1,1,n,a,b);
		}
		else
		{
			sol=0;
			query(1,1,n,a,b);
			printf("%d\n",sol);
		}
	}
    return 0;
}