Cod sursa(job #1162384)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 31 martie 2014 19:44:59
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int N,M,i,Rez,X,Y,val,poz,A[100005],Arb[(1<<18)+5];
void Build(int Node,int L,int R)
{
    if(L==R) {Arb[Node]=A[L]; return;}
    int M=(L+R)/2;
    int LS=2*Node;
    int RS=LS+1;
    Build(LS,L,M);
    Build(RS,M+1,R);
    Arb[Node]=max(Arb[LS],Arb[RS]);
}
void Update(int Node,int L,int R)
{
    if(L==R) {Arb[Node]=val; return;}
    int M=(L+R)/2;
    int LS=2*Node;
    int RS=LS+1;
    if(poz<=M) Update(LS,L,M);
    else Update(RS,M+1,R);
    Arb[Node]=max(Arb[LS],Arb[RS]);
}
void Query(int Node,int L,int R)
{
    if(L>=X && R<=Y)
    {
        Rez=max(Rez,Arb[Node]);
        return;
    }
    int M=(L+R)/2;
    int LS=2*Node;
    int RS=LS+1;
    if(X<=M) Query(LS,L,M);
    if(Y>M) Query(RS,M+1,R);
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&N,&M);
	for(i=1;i<=N;i++) scanf("%d",&A[i]);
	Build(1,1,N);
	for(;M;M--)
	{
	    scanf("%d",&i);
	    if(i==0)
	    {
	        scanf("%d%d",&X,&Y);
	        Rez=0; Query(1,1,N);
	        printf("%d\n",Rez);
	    }
	    else
	    {
	        scanf("%d%d",&poz,&val);
	        Update(1,1,N);
	    }
	}
	return 0;
}