Paste will expire never.
- #include <iostream>
- using namespace std;
- const int SIZE = 31;
- struct Node {
- int data;
- Node* left;
- Node* right;
- Node(){}
- Node(int Data) {
- data = Data;
- left = 0;
- right = 0;
- }
- Node(const Node &n) {
- data = n.data;
- Node *l = 0, *r = 0;
- if (n.left) l = new Node(*n.left);
- if (n.right) r = new Node(*n.right);
- left = l;
- right = r;
- }
- ~Node() {
- if (left) {
- delete left;
- left = 0;
- }
- if (right) {
- delete right;
- right = 0;
- }
- }
- };
- struct binomial_queue {
- Node* mas[SIZE];
- int size;
- binomial_queue(){memset(mas,0,sizeof(mas)); size = 0;}
- binomial_queue(const binomial_queue &bq) {
- memset(mas,0,sizeof(mas));
- size = bq.size;
- for (int i=0;i<SIZE;i++) {
- if (bq.mas[i]) {
- Node* deepCopy = new Node(*bq.mas[i]);
- mas[i] = deepCopy;
- }
- }
- }
- ~binomial_queue() {
- for (int i=0;i<SIZE;++i) {
- if (mas[i])
- delete mas[i];
- }
- }
- void clear() {
- memset(mas,0,sizeof(mas)); size = 0;
- }
- void read() {
- int n,val;
- scanf("%d",&n);
- for (int i=0;i<n;i++) {
- scanf("%d", &val);
- add(val);
- }
- }
- void output(char * str) {
- printf("%s : ", str);
- binomial_queue bq = *this;
- while (!bq.empty())
- printf("%d ", bq.getMax());
- printf("\n");
- }
- bool empty() {
- return size == 0;
- }
- Node* join(Node* f, Node *s) {
- if (f->data > s->data) {
- s->right = f->left; f->left = s; return f;
- }
- else {
- f->right = s->left; s->left = f; return s;
- }
- }
- int num(int c, int b, int a) {
- return 4*c + 2*b + a;
- }
- void joinBQ(Node* a[], Node* b[]) {
- Node* c = 0;
- for (int i=0;i<SIZE;i++) {
- switch(num(c!=0,b[i]!=0,a[i]!=0)) {
- case 2: a[i] = b[i]; break;
- case 3: c = join(a[i],b[i]); a[i] = 0; break;
- case 4: a[i] = c; c = 0; break;
- case 5: c = join(a[i],c); a[i] = 0; break;
- case 6:
- case 7: c = join(b[i],c); break;
- }
- }
- }
- void joinBQ(binomial_queue &bq) {
- joinBQ(mas, bq.mas);
- size += bq.size;
- bq.clear();
- }
- void add(int val) {
- Node* newNode = new Node(val);
- Node* curNode = newNode;
- for (int i=0;i<SIZE;i++) {
- if (mas[i] == NULL) {
- mas[i] = curNode;
- break;
- }
- else {
- curNode = join(curNode,mas[i]);
- mas[i] = NULL;
- }
- }
- size++;
- }
- int getMax() {
- int res = 0;
- int resPos = -1;
- for (int i=0;i<SIZE;i++) {
- if (mas[i] && mas[i]->data > res) {
- res = mas[i]->data;
- resPos = i;
- }
- }
- Node** tmp = new Node*[SIZE];
- memset(tmp,0,sizeof(tmp)*SIZE);
- Node* cur = mas[resPos]->left;
- for (int i=resPos-1;i>=0;i--) {
- tmp[i] = new Node(*cur);
- cur = cur->right;
- tmp[i]->right = 0;
- }
- delete mas[resPos];
- mas[resPos] = 0;
- joinBQ(mas, tmp);
- delete tmp;
- size--;
- return res;
- }
- };
- int main() {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- binomial_queue bq1,bq2;
- bq1.read(); bq2.read();
- bq1.output("first bin_queue");
- bq2.output("second bin_queue");
- bq1.joinBQ(bq2);
- bq1.output("union first&second bin_queue");
- return 0;
- }
Editing is locked.