Cod sursa(job #1193133)

Utilizator ZenusTudor Costin Razvan Zenus Data 31 mai 2014 00:24:41
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>

using namespace std;

#define NMAX 1<<19
#define max(a,b) ((a>b) ? a : b)

int Tree[NMAX];
int P,X,A,B,i,type,N,M;

void Update(int nod,int L,int R)
{
    int M;

    if (L>=R)
    {
        Tree[nod]=X;
        return;
    }

    M=(L+R)/2;

    if (P<=M) Update(2*nod,L,M);
      else Update(2*nod+1,M+1,R);

    Tree[nod]=max(Tree[2*nod],Tree[2*nod+1]);
}

int Query(int nod,int L,int R)
{
    int M=(L+R)/2,leftM=0,rightM=0;

    if (A<=L && R<=B) return Tree[nod];

    if (A<=M) leftM=Query(nod*2,L,M);
    if (B>M) rightM=Query(nod*2+1,M+1,R);

    return max(leftM,rightM);
}

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",&X);
    P=i;
    Update(1,1,N);
}

while (M--)
{
    scanf("%d%d%d",&type,&A,&B);

    if (type==1)
    {
        P=A;
        X=B;
        Update(1,1,N);
        continue;
    }

    printf("%d\n",Query(1,1,N));
}

return 0;
}