Cod sursa(job #949983)

Utilizator assa98Andrei Stanciu assa98 Data 15 mai 2013 16:53:51
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <algorithm>
using namespace std;

inline int tata(const int nod)
{
    return nod/2;
}
inline int fiu1(const int nod)
{
    return nod*2;
}
inline int fiu2(const int nod)
{
    return nod*2+1;
}

struct sp
{
    int a,b;
    int val;
} v[500000];

void build(int nod,int a,int b)
{
    v[nod].a=a;
    v[nod].b=b;
    v[nod].val=0;
    if(a<b)
    {
        int mij=(a+b)/2;
        build(fiu1(nod),a,mij);
        build(fiu2(nod),mij+1,b);
    }
}

void update(int val,int nod,int a)
{
    if(v[nod].a<v[nod].b)
    {
        int mij=(v[nod].a+v[nod].b)/2;
        if(a<=mij)
        {
            update(val,fiu1(nod),a);
        }
        else if(a>mij)
        {
            update(val,fiu2(nod),a);
        }
        v[nod].val=max(v[fiu1(nod)].val,v[fiu2(nod)].val);
    }
    else v[nod].val=val;
}

int n,m;

int main()
{
    freopen("aint.in","r",stdin);
    freopen("aint.out","w",stdout);
    scanf("%d%d",&n,&m);
    build(1,1,n);
    for(int i=1;i<=n;i++)
    {
        int a;
        scanf("%d",&a);
        update(a,1,i);
    }
    for(int i=1;i<=m;i++)
    {
        int o,a,b;
        scanf("%d%d%d",&o,&a,&b);
        if(o==0)
        {
            update(b,1,a);
            for(int i=1;i<=10;i++)
                printf("%d %d : %d\n",v[i].a,v[i].b,v[i].val);
            printf("\n");
        }
        else if(o==1)
        {

        }
    }
    return 0;
}