Cod sursa(job #1156462)

Utilizator florin.ilieFlorin Ilie florin.ilie Data 27 martie 2014 18:12:55
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
using namespace std;

struct nod{
    int x;
    nod *st,*dr;
}*arb;

int n,m,poz,val,mx,x;

void adaugare(nod *&cel,int st,int dr)
{
    if(!cel){
        cel = new nod;
        cel->x=0;
        cel->st=0;
        cel->dr=0;
    }
    if(st==dr){
        cel->x=val;
        return;
    }
    int div=(st+dr)/2;
    if(poz<=div)    adaugare(cel->st,st,div);
    else            adaugare(cel->dr,div+1,dr);
    if(cel->st && !cel->dr)
        cel->x = cel->st->x;
    else if(cel->dr && !cel->st)
        cel->x = cel->dr->x;
    else
        cel->x = ((cel->st->x>cel->dr->x)?cel->st->x:cel->dr->x);
}

void maxim (nod *cel,int st,int dr)
{
    if(poz<=st && dr<=val){
        if(cel->x>mx)
            mx=cel->x;
        return;
    }
    int div=(st+dr)/2;
    if(poz <= div)  maxim(cel->st,st,div);
    if(div < val)   maxim(cel->dr,div+1,dr);
}

int main()
{
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin>>n>>m;
    for(int i=1;i<=n;i++){
        fin>>x;
        poz=i;
        val=x;
        adaugare(arb,1,n);
    }
    for(int i=1;i<=m;i++)
    {
        fin>>x>>poz>>val;
        if(x==0){
            mx=0;
            maxim(arb,1,n);
            fout<<mx<<'\n';
        }else{
            adaugare(arb,1,n);
        }
    }
    return 0;
}