Cod sursa(job #891062)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 25 februarie 2013 13:23:25
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <stdio.h>
using namespace std;
#define MAX_N 200000
int N;
struct nod
{
    int nr,n;
    nod *next;
}*First,*List[MAX_N];
nod * Insert(nod *p,int nr,int n){
    if(p->next==0||nr<p->next->nr){
        nod *q=new nod;
        q->nr=nr;
        q->n=n;
        q->next=p->next;
        p->next=q;
        if(q->next){
//            printf("n:%d\n",q->next->n);
            List[q->next->n]=q;
        }
        return p;
    }
    return Insert(p->next,nr,n);
}
int ReturnMin(){
    return First->next->nr;
}
void Delete(int nr){
    nod *p=List[nr];
    nod *q=p->next;
    p->next=q->next;
    delete q;
    List[nr]=0;
    if(p->next)
        List[p->next->nr]=p;
}
int main()
{
    First=new nod;
    First->next=0;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d\n",&N);
    int i,n=0,type,nr;
    for(i=1;i<=N;i++){
        scanf("%d ",&type);
        if(type==1){
            n++;
            scanf("%d\n",&nr);
            List[n]=Insert(First,nr,n);
        }
        else if(type==2){
            scanf("%d\n",&nr);
            Delete(nr);
        }
        else{
            scanf("\n");
            printf("%d\n",ReturnMin());
        }
    }
    /*
    List[1]=Insert(First,4,1);
    List[2]=Insert(First,7,2);
    List[3]=Insert(First,9,3);
    printf("%d\n",ReturnMin());
    List[4]=Insert(First,2,4);
    Delete(1);
    printf("%d\n",ReturnMin());
    printf("%d\n",List[4]->next->nr);*/

    fclose(stdin);
    fclose(stdout);
    return 0;
}