Cod sursa(job #2072178)

Utilizator HoriaDruliacHoria Druliac HoriaDruliac Data 21 noiembrie 2017 15:40:38
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
int A[100000];
int S[400000];
int n,m;

void build(int root=1, int l=1, int r=n+1)
{
	if (r-l==1)
		S[root]=0;
	else
	{
		int mid;
		mid=(l+r+1)/2;
		build(2*root,l,mid);
		build(2*root+1,mid,r);
		S[root]=max(S[2*root],S[2*root+1]);
	}
}

void modify(int root, int l, int r, int poz, int x)
/// A[poz]=x
{
	int mid;
	if (poz<l || poz>=r)
		return;
	A[poz]=x;
	S[root]=x;
	if (r-l>1)
	{
		mid=(l+r+1)/2;
		modify(root*2,l,mid,poz,x);
		modify(root*2+1,mid,r,poz,x);
		S[root]=max(S[root*2],S[root*2+1]);
	}
}

int query(int root, int l, int r, int st, int dr)
{
	if (dr<=l || st>=r)
		return 0;
	if (st<=l && dr>=r)
		return S[root];
	int mid;
	mid=(l+r+1)/2;
	return max(query(root*2,l,mid,st,dr),query(root*2+1,mid,r,st,dr));
}

int main()
{
	fi>>n>>m;
	build(1,1,n+1);
	for (int i=1;i<=n;i++)
	{
		int a;
		fi>>a;
		modify(1,1,n+1,i,a);
	}
	for (int i=1;i<=m;i++)
	{
		int a,b,tip;
		fi>>tip;
		if (tip==0)
		{
			fi>>a>>b;
			fo<<query(1,1,n+1,a,b+1)<<"\n";
		}
		else
		{
			fi>>a>>b;
			modify(1,1,n+1,a,b);
		}
	}
	fi.close();
	fo.close();
	return 0;
}