Cod sursa(job #1751292)

Utilizator NicusorTelescu Nicolae Nicusor Data 1 septembrie 2016 10:00:07
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>

using namespace std;

int arb[400001],maxim=0,nod_p;

void sus(int nod)
{
    if (arb[nod*2] > arb[nod*2+1])
        arb[nod]=arb[nod*2];
    else arb[nod]=arb[nod*2+1];

    if (nod!=1)
        sus(nod/2);
}

void insereaza(int nod,int nr,int poz,int a,int b)
{
    arb[nod]=-1;
    if (a==b)
    {
        arb[nod]=nr;
        nod_p=nod;
    }
    else
    {
        int mij=(a+b)/2;

        if (poz <= mij)
            insereaza(nod*2,nr,poz,a,mij);
        else
            insereaza(nod*2+1,nr,poz,mij+1,b);
    }
}

void interogheaza(int nod,int a,int b,int st,int dr)
{
    if (a<=st && dr<=b)
    {
        if (arb[nod] > maxim)
            maxim=arb[nod];
    }
    else
    {
        int mij=(st+dr)/2;

        if (a <= mij)
            interogheaza(nod*2,a,b,st,mij);
        if (b > mij)
            interogheaza(nod*2+1,a,b,mij+1,dr);
    }
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m;
    scanf("%d %d\n",&n,&m);

    for (int i=1;i<=200000;i++)
        arb[i]=-1;

    for (int i=1;i<=n;i++)
    {
        int a;
        scanf("%d ",&a);
        insereaza(1,a,i,1,n);
        sus(nod_p/2);
    }

    for (int i=1;i<=m;i++)
    {
        int a,x,y;
        scanf("%d %d %d\n",&a,&x,&y);

        if (a==1)
            insereaza(1,y,x,1,n), sus(nod_p/2);
        if (a==0)
        {
            maxim=0;
            interogheaza(1,x,y,1,n);
            printf("%d\n",maxim);
        }
    }
}