Cod sursa(job #1520074)

Utilizator UMihneaUngureanu Mihnea UMihnea Data 8 noiembrie 2015 12:05:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <iomanip>
#include <algorithm>
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");
struct nod
{
    int inf;
    nod *FS,*FD,*TA;
    nod(){inf=0;FS=FD=TA=NULL;}
    nod(int Inf){inf=Inf;FS=FD=TA=NULL;}
};
nod *root,*P[100010],*construieste(nod*,int,int);
int p, q, cod, a, b, n, i, t = 1, x, aint[265000], query(nod*, int, int);

int main()
{
    f>>n>>q;
    for(i=1;i<=n;i++)
    {
        f>>x;
        P[i]=new nod(x);
    }
    root=construieste(NULL,1,n);
    for(;q;q--)
    {
        f>>cod>>a>>b;
        if(cod==1)
        {
            P[a]->inf=b;
            for(nod *aux=P[a]->TA;aux;aux=aux->TA)
                aux->inf=max(aux->FS->inf,aux->FD->inf);
            continue;
        }
        g<<query(root,1,n)<<'\n';
    }
}
nod *construieste(nod *dad,int L,int R)
{

    if(L<R)
    {
        nod *aux;
        aux=new nod;
        aux->TA=dad;
        aux->FS=construieste(aux,L,(L+R)/2);
        aux->FD=construieste(aux,(L+R)/2+1,R);
        aux->inf=max(aux->FS->inf,aux->FD->inf);
        return aux;
    }
    P[L]->TA=dad;
    return P[L];
}
int query(nod *N, int L, int R)
{
    if(b<L||R<a)
        return 0;
    if(a<=L&&R<=b)
        return N->inf;
    return max(query(N->FS,L,(L+R)/2),query(N->FD,(L+R)/2+1,R));
}