Cod sursa(job #717792)

Utilizator algotrollNume Fals algotroll Data 20 martie 2012 11:10:02
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<cstdio>
#define _NMAX 100010
int nA, vA[_NMAX];
int i_tree[_NMAX*2];
int max(int a,int b)
{
    if(a>b) return a;
    else return b;
}

int create_tree(int iNod,int i,int j)
{
    if (i==j) return i_tree[iNod]=vA[i];
    else return i_tree[iNod]=max(create_tree(iNod*2,i,(i+j)/2),
                                 create_tree(iNod*2+1,(i+j)/2+1,j));
}

int update_tree(int iNod,int i,int j, int iAs)
{
    if (i==j) return i_tree[iNod]=vA[i];
    else if (iAs<=(i+j)/2)
        return i_tree[iNod]=max(update_tree(iNod*2,i,(i+j)/2,iAs),i_tree[iNod+1]);
         else
        return i_tree[iNod]=max(i_tree[iNod-1],update_tree(iNod*2+1,(i+j)/2+1,j,iAs));
}

int maxquery_tree(int iNod, int i, int j, int segm_beg, int segm_end)
{
    if (segm_beg>j||segm_end<i) return 0;
    if (segm_beg<=i && segm_end>=j) return i_tree[iNod];
    return max(maxquery_tree(iNod*2,i,(i+j)/2,segm_beg,segm_end),
               maxquery_tree(iNod*2+1,(i+j)/2+1,j,segm_beg,segm_end));
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int nOperatii;
    scanf("%d %d",&nA, &nOperatii);
    for (int i=1;i<=nA;i++)
        scanf("%d",&vA[i]);
    create_tree(1, 1, nA);
    for (int i=1;i<=nOperatii;i++)
    {
        int atrib;
        scanf("%d",&atrib);
        if (atrib)
        {
            int iAs, valAs;
            scanf("%d %d",&iAs, &valAs);
            vA[iAs]=valAs;
            update_tree(1,1,nA,iAs);
        }
        else
        {
            int seg_b, seg_e;
            scanf("%d %d",&seg_b, &seg_e);
            printf("%d\n", maxquery_tree(1,1,nA,seg_b,seg_e));
        }
    }
    return 0;
}