Cod sursa(job #1051883)

Utilizator redls_95Nechita Laura redls_95 Data 10 decembrie 2013 17:39:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>

const int Q=100000+1;
int v[Q],pozarb[Q];
int arb[1<<18];

int max(int a, int b)
{
    return a>b ? a : b;
}

int make_arb(int val,int st, int dr)
{
    if(st!=dr)
    {
        arb[val]=max( make_arb(2*val,st,(dr+st)/2), make_arb(2*val+1,(st+dr)/2+1,dr));
    }
    else
    {
        pozarb[st]=val;
        arb[val]=v[st];
    }
    return arb[val];
}

void modif_arb(int poz)
{
    arb[poz]=max(arb[2*poz],arb[2*poz+1]);
    if(poz/2!=0)
        modif_arb(poz/2);
}

int find_max(int poz,int s, int d,int st,int dr)
{
    if(s>=st && d<=dr)
        return arb[poz];
    if(st>d || dr<s)
        return 0;

    return max(find_max(poz*2,s,(s+d)/2,st,dr),find_max(poz*2+1,(s+d)/2+1,d,st,dr));


}

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

    int n,h;
    scanf("%d%d",&n,&h);

    for(int i=1; i<=n; i++)
    {
        scanf("%d",&v[i]);
    }
    int x;
    x=make_arb(1,1,n);

    int t,a,b;
    for(int i=1; i<=h; i++)
    {
        scanf("%d%d%d",&t,&a,&b);

        if(t==1)
        {
            v[a]=b;
            arb[pozarb[a]]=b;
            modif_arb(pozarb[a]/2);
        }
        else
        {
            printf("%d\n",find_max(1,1,n,a,b));
        }
    }


    return 0;
}