Cod sursa(job #1443049)

Utilizator ZimmyZimmermann Erich Zimmy Data 26 mai 2015 18:31:44
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
struct nod
{
    int M;
    nod *st,*dr,*ta;
};
nod *root;
int n,m,a,b,x[100010],c,Max(int,int,nod*),i;
nod *build(int,int,nod *),*p[100010];
int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>x[i];
    root=build(1,n,NULL);
    for(;m;m--)
    {
        f>>c>>a>>b;
        if(c==0)
            g<<Max(1,n,root);
        else
        {
            p[a]->M=b;
            for(nod *aux=p[a]->ta;aux;aux=aux->ta)
                aux->M=max(aux->st->M,aux->dr->M);
        }
    }

    return 0;
}
nod *build(int l,int r,nod *t)
{
    nod *aux;
    aux=new nod;
    aux->ta=t;
    if(l==r)
    {
        aux->M=x[l];
        aux->st=NULL;
        aux->dr=NULL;
        p[l]=aux;
    }
    else
    {
        aux->st=build(l,(l+r)/2,aux);
        aux->dr=build((l+r)/2+1,r,aux);
        aux->M=max(aux->st->M,aux->dr->M);
    }
    return aux;
}
int Max(int l,int r,nod *N)
{
    if(a<=l&& r<=b)return N->M;
    if(r<a || l>b) return 0;
    return max(Max(l,(l+r)/2,N->st),Max((l+r)/2+1,r,N->dr));
}