Cod sursa(job #846177)

Utilizator test_13testing test_13 Data 1 ianuarie 2013 17:04:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
int x,y,n,m,rasp;
int arb[1<<18];

void update(int nod,int lf,int rt)
{
    //printf("%d %d\n",lf,rt);
    if(lf==rt)
    {
        arb[nod]=y;
        return ;
    }
        int md=(lf+rt)/2;
        if(x<=md)update(2*nod,lf,md); else
            update(2*nod+1,md+1,rt);
        arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}

void query(int nod,int lf,int rt)
{
    if(x<=lf && rt<=y)
    {
       // printf("%d %d\n",lf,rt);
        rasp=max(rasp,arb[nod]);
        return ;
    }
        int md=(lf+rt)/2;
        if(x<=md)query(2*nod,lf,md);
        if(y>md)query(2*nod+1,md+1,rt);
}

int main()
{
    int op;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            x=i;
            scanf("%d",&y);
            update(1,1,n);
        //for(int i=1;i<=2*n;i++)printf("%d ",arb[i]);
        //printf("\n");
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d %d %d",&op,&x,&y);
            switch(op)
            {
                case 0:
                rasp = 0;
                query(1,1,n);
                printf("%d\n",rasp);
                break;
                case 1:
                update(1,1,n);
            }
        }
    //for(int i=1;i<=2*n+1;i++) printf("%d ",arb[i]);

    return 0;
}