Cod sursa(job #531564)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 9 februarie 2011 21:21:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<stdio.h>
int a[100005];
int A,B,x;
int Tree[263000];
int maxim;
int n,m;
void InitA(int nod, int st, int fin)
{
    if (st == fin)
     Tree[nod] = fin;
    else
    {
    InitA(2*nod,st,(st+fin)/2);
    InitA(2*nod + 1,(st+fin)/2 + 1, fin);

    if (a[Tree[2*nod + 1]] > a[Tree[2*nod]])
     Tree[nod] = Tree[2 * nod + 1];
    else
     Tree[nod] = Tree[2 * nod];
    }
}

void Query(int nod,int st, int dr)
{
    if (A <= st && dr <= B)
     {
         if (a[maxim] < a[Tree[nod]])
          maxim = Tree[nod];
     }
    else
    {
     if (A <= (st + dr) / 2)
      Query(2 * nod, st,(st+dr)/2);
     if (B > (st + dr) / 2)
      Query(2 * nod + 1,(st+dr)/2 + 1, dr);

    }

}
void Update(int nod, int st, int dr)
{

        if (st == dr && st == A)
        {
            return;
        }
        else
        {
        if (A <= (st + dr) / 2) Update(2 * nod,st,(st+dr)/2);
                           else Update(2 * nod + 1,(st+dr)/2 + 1, dr);
        if (a[Tree[2 * nod]] > a[Tree[2 * nod + 1]])
          Tree[nod] = Tree[2 * nod];
         else
          Tree[nod] = Tree[2 * nod + 1];
        }
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d %d",&n,&m);
    for(int i = 1; i <= n; i++)
     scanf("%d",&a[i]);

     InitA(1,1,n);
    for(int i = 1; i <= m; i++)
     {
         scanf("%d %d %d",&x,&A,&B);
         if (x == 0)
          {
              maxim = 0;
              Query(1,1,n);
              printf("%d\n",a[maxim]);
          }
         if (x == 1)
         {
             a[A] = B;
             Update(1,1,n);

         }
     }
     return 0;
}