Cod sursa(job #1769206)

Utilizator octav1234Pocola Tudor Octavian octav1234 Data 2 octombrie 2016 10:19:43
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *fi,*fo;
int n,m,i,tip,a,b;
int A[100001],T[100001];
void build(int ind,int st,int dr)
{
	if(dr-st<2)
	{
		T[ind]=A[st];
		return ;
	}
	int mid=(st+dr)/2;
	build(2*ind,st,mid);
	build(2*ind+1,mid,dr);
	T[ind]=max(T[2*ind],T[2*ind+1]);
}
int query(int l,int r,int ind, int st,int dr)
{
	if(st>=r || dr<=l)
		return 0;
	if(l<=st && dr<=r)
		return T[ind];
	int mid=(st+dr)/2;
	return max(query(l,r,2*ind,st,mid),query(l,r,2*ind+1,mid,dr));	
}
void update(int poz,int val,int ind,int st,int dr)
{
	if(st>poz||poz>=dr)
		return;
	if(dr-st<2)
	{
		if(st==poz)
		{
			T[ind]=val;
		}
		return ;
	}
	int mid=(st+dr)/2;
	update(poz,val,2*ind,st,mid);
	update(poz,val,2*ind+1,mid,dr);
	T[ind]=max(T[2*ind],T[2*ind+1]);
}
int main()
{
	fi=fopen("arbint.in","r");
	fo=fopen("arbint.out","w");
	fscanf(fi,"%d%d",&n,&m);
	for(i=0;i<n;i++)
		fscanf(fi,"%d",&A[i]);
	build(1,0,n);
	for(i=1;i<=m;i++)
	{
		fscanf(fi,"%d%d%d",&tip,&a,&b);
		if(tip == 0)
			fprintf(fo,"%d\n",query(a-1,b,1,0,n));
		else
			update(a-1,b,1,0,n);
	}
	fclose(fi);
	fclose(fo);
	return 0;
}