Cod sursa(job #2739376)

Utilizator MihclerioVladimir Chim Mihclerio Data 8 aprilie 2021 01:02:37
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.05 kb
#include <iostream>

using namespace std;

int len=0;
int ordine[200005];

struct Node{
int data;
struct Node *r,*l;
};

struct Node*   NodNou(int valoare){
struct Node* nod= (struct Node*) malloc(sizeof(struct Node));
nod->l=NULL; nod->r=NULL;
nod->data=valoare;
return nod;
} ;

struct Node* Adauga(struct Node* rad,int val){

struct Node *nod=NodNou(val);

struct Node *ch,*rem;

ch=rad; rem=NULL;

while (ch!=NULL){
    rem=ch;
    if (val<ch->data) ch=ch->l;  else if (val>ch->data) ch=ch->r;  else if (val==ch->data) return NULL;
}

if (rem==NULL) return nod;

else if(val<rem->data) rem->l=nod;

else if( val>rem->data) rem->r=nod;

return NULL;

};

int MaxLeftSubtree(struct Node* rad){
struct Node *rem,*rs; int val;
rem=rad; rs=rad;
rad=rad->l;
while (rad->r!=NULL){
        rem=rad;
    rad=rad->r;
}

if(rs==rem) {rs->l=rad->l; val=rad->data; free(rad); return val;}

else {rem->r=NULL; val=rad->data; free(rad); return val;}

}

int MinRightSubtree(struct Node* rad){

struct Node *rem,*rs; int val;
rem=rad; rs=rad;
rad=rad->r;

while (rad->l!=NULL){
        rem=rad;
    rad=rad->l;
}

if(rs==rem) {rs->r=rad->r; val=rad->data; free(rad); return val;}

else {rem->l=NULL; val=rad->data; free(rad); return val;}
}

void Sterge(struct Node* rad, int val){

if (rad==NULL) return;

struct Node* rem;

while (rad!=NULL && rad->data!=val ){
        rem=rad;
    if(val<rad->data) rad=rad->l;
    if(val>rad->data) rad=rad->r;
}

if (rad==NULL) return;

if (rad->l==NULL && rad->r==NULL) {if(rem->l==rad) rem->l=NULL; else rem->r=NULL;  free(rad); return; }

if(rad->l!=NULL)  {rad->data=MaxLeftSubtree(rad); return; }

if (rad->l==NULL) {rad->data=MinRightSubtree(rad); return;}
}

int k;

void InOrder(struct Node* rad,int elem,int *arr,int narr){
 if (rad != NULL) {InOrder(rad->l,elem,arr,narr); k++; if(k==elem) {arr[narr]=rad->data; return;}  InOrder(rad->r,elem,arr,narr);}
}

void PostOrder(struct Node* rad,int elem,int *arr,int narr){
 if (rad != NULL) {PostOrder(rad->l,elem,arr,narr); PostOrder(rad->r,elem,arr,narr); k++; if(k==elem) {arr[narr]=rad->data;  return;}  }
}

void PreOrder(struct Node* rad,int elem,int *arr,int narr){
 if (rad != NULL) {k++; if(k==elem) {arr[narr]=rad->data;  return;} PreOrder(rad->l,elem,arr,narr); PreOrder(rad->r,elem,arr,narr);   }
}

int mintree(struct Node* rad)
{
    if(rad == NULL) return -45;
    if(rad->l == NULL)
        return rad->data;

    return mintree(rad->l);
}

int main(){
freopen("heapuri.in","r",stdin);
  freopen("heapuri.out","w",stdout);
int n,i,x,m,a,b;

struct Node* rad=NULL;

int arr[1500],narr=0;

cin>>n;

for(int i=0;i<n;i++)
{
    cin>>x;

    if(x==1)
    {
        cin>>a;
        if(rad==NULL)
            rad = Adauga(rad, a);
        else
            Adauga(rad, a);

        ordine[++len] = a;
    }
    else
    if(x==2)
    {
        cin>>a;
        Sterge(rad, ordine[a]);
    }
    else
    {
        b = mintree(rad);
        cout<<b<<"\n";
    }
}

    return 0;
}