Cod sursa(job #1767253)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 28 septembrie 2016 20:59:19
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MaxT 265000
#define MaxN 100001
#define MAX 131072
using namespace std;

int N,M,T[MaxT],pos,v[MaxN],Start,End,Type,Ans,P,Val,out;
char f[MAX],Out[MAX],str[10];
void Write_Ch(char ch)
{
	Out[out++]=ch;
	if(pos==MAX)
	{
		fwrite(Out,1,MAX,stdout);
		pos=0;
	}
}
void Write_Int(int nr)
{
	int x=0;
	do
	{
		str[x++]=nr%10+'0';
		nr/=10;
	}
	while(nr);
	while(x>0)
	{
		x--;
		Write_Ch(str[x]);
	}
}
int max2(int a,int b)
{
	if (a>b) return a;
	else return b;
}
void Read(int &nr)
{
	nr=0;
	while(f[pos]<'0'||f[pos]>'9')
	{
		pos++;
		if(pos==MAX)
			fread(f,1,MAX,stdin),pos=0;
	}
	while(f[pos]>='0'&&f[pos]<='9')
	{
		nr=10*nr+f[pos++]-'0';
		if(pos==MAX)
			fread(f,1,MAX,stdin),pos=0;
	}
}
void DFS(int node,int start,int end)
{
	if(start==end)
	{
		T[node]=v[start];
		return;
	}
	DFS(node*2,start,(start+end)>>1);
	DFS(node*2+1,((start+end)>>1)+1,end);
	T[node]=max2(T[node*2],T[node*2+1]);
}
void Update(int node,int start,int end)
{
	if(start==end)
	{
		T[node]=Val;
		return;
	}
	int mid=(start+end)>>1;
	if(P>mid)
		Update(node*2+1,mid+1,end);
	else Update(node*2,start,mid);
	T[node]=max2(T[2*node],T[2*node+1]);
}
void Query(int node,int start,int end)
{
	if(start>=Start&&end<=End)
		Ans=max2(Ans,T[node]);
	else
	{
		int mid=(start+end)>>1;
		if (Start<=mid)
			Query(node*2,start,mid);
		if(End>mid) Query(node*2+1,mid+1,end);
	}
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
	fread(f,1,MAX,stdin);
	Read(N);
	Read(M);
	for(int i=1;i<=N;i++)
		Read(v[i]);
	DFS(1,1,N);
	for(int i=1;i<=M;i++)
	{
		Read(Type);
		if(!Type)
		{
			Read(Start),Read(End);
			Ans=0;
			Query(1,1,N);
			Write_Int(Ans);
			Write_Ch('\n');
		}
		else
		{
			Read(P),Read(Val);
			Update(1,1,N);
		}
	}
	fwrite(Out,1,out,stdout);
    return 0;
}