Cod sursa(job #1348642)

Utilizator armandpredaPreda Armand armandpreda Data 19 februarie 2015 20:00:29
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int n,v[100005],ai[1000005],ans;
void make(int nod,int st,int dr)
{
    if(st==dr)
    {
        ai[nod]=v[st];
        return;
    }
    int med=(st+dr)/2;
    make(nod*2,st,med);
    make(nod*2+1,med+1,dr);
    ai[nod]=max(ai[nod*2],ai[nod*2+1]);
}
void update(int poz,int val,int nod,int st,int dr)
{
	if(st==dr)
	{
		ai[nod]=val;
		return;
	}
	int med=(st+dr)/2;
	if(med<=poz)
		update(poz,val,nod*2,st,med);
	else
		update(poz,val,nod*2+1,med+1,dr);
	ai[nod]=max(ai[nod*2],ai[nod*2+1]);
}
int query(int nod,int st,int dr,int x,int y)
{
    if(x<=st and y>=dr)
    {
        ans=max(ans,ai[nod]);
        return ;
    }
    int med=(st+dr)/2;
    if(x<=med) query(2*nod,st,med,x,y);
    if(y>med) query(2*nod+1,med+1,dr,x,y);
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	int q;
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;++i)
		scanf("%d",v+i);
    make(1,1,n);
	for(int i=1;i<=q;++i)
	{
		int t,a,b;
		scanf("%d%d%d",&t,&a,&b);
		if(t==1)
			update(a,b,1,1,n);
		if(t==0)
        {
            ans=0;
            query(1,1,n,a,b);
            printf("%d\n",ans);
        }
	}
	return 0;
}