#include<stdio.h>
#include<stdlib.h>
int count;
struct node{
int value;
struct node* next;
};
int constructFinal(int *final,struct node **parent,struct node **output,int value){
if(final[value - 1] == 1)
return 0;
final[value - 1] = 1;
count++;
struct node* temp;
temp = parent[value-1];
while(temp!= NULL){
constructFinal(final,parent,output,temp->value);
temp = temp->next;
}
}
int findIndex(int currentElement,struct node** output,int lower,int upper){
if(lower >= upper)
return lower;
int mid =lower + ( upper - lower )/2;
if(output[mid]->value < currentElement)
return findIndex(currentElement,output,mid+1,upper);
else if(output[mid]->value > currentElement)
return findIndex(currentElement,output,lower,mid);
}
int main(){
int numOfInp,sizeOfInp,i,currentElement,sizeOfOut,indexBinary,indexAdded;
struct node *temp,*tempIter;
numOfInp=1;
while(numOfInp--){
struct node **output; // if I initialise normal initialisation, I may not get the data as 0 by default, hence callocing
struct node **parent;
int *input;
input
= (int *)calloc(sizeOfInp
,sizeof(int)); for(i=0 ; i< sizeOfInp ; i++)
parent
= (struct node
**)calloc(sizeOfInp
, sizeof(struct node
*));
output
= (struct node
**)calloc(sizeOfInp
, sizeof(struct node
*)); sizeOfOut = 0;
for(i=0;i<sizeOfInp;i++){
indexBinary = -1;
currentElement = input[i];
if(sizeOfOut == 0){
output
[sizeOfOut
] = (struct node
*)calloc(1,sizeof(struct node
)); output[sizeOfOut]->value = currentElement;
indexAdded = sizeOfOut;
sizeOfOut++;
}
else{
if(currentElement > output[sizeOfOut-1]->value){
output
[sizeOfOut
] = (struct node
*)calloc(1,sizeof(struct node
)); output[sizeOfOut]->value = currentElement;
indexAdded = sizeOfOut;
sizeOfOut++;
}
else{
indexBinary = findIndex(currentElement,output,0,sizeOfOut-1);
temp
= (struct node
*)calloc(1,sizeof(struct node
)); temp->next = output[indexBinary];
output[indexBinary] = temp;
output[indexBinary]->value = currentElement;
indexAdded = indexBinary;
}
}
//parent[currentElement-1] = (struct node*)calloc(sizeof(struct node));
if(indexAdded > 0){
tempIter = output[indexAdded-1];
while(tempIter != 0 && tempIter->value < currentElement){ //for all the elements in the previous bucket
temp
= (struct node
*)calloc(1,sizeof(struct node
)); //add the values to parent temp->next = parent[currentElement-1];
parent[currentElement-1] = temp;
parent[currentElement-1]->value = tempIter ->value;
tempIter = tempIter->next;
}
}
else{
parent[currentElement-1] = NULL; // these are the elements in the first bucket of output
}
}
int *final;
final
= (int*)calloc(sizeOfInp
,sizeof(int)); temp = output[sizeOfOut -1];
count=0;
while(temp != NULL){
constructFinal(final,parent,output,temp->value);
temp=temp->next;
}
for(i=0;i<sizeOfInp;i++)
if(final[i]==1)
}
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CgppbnQgY291bnQ7CgpzdHJ1Y3Qgbm9kZXsKCWludCB2YWx1ZTsKCXN0cnVjdCBub2RlKiBuZXh0Owp9OwoKaW50IGNvbnN0cnVjdEZpbmFsKGludCAqZmluYWwsc3RydWN0IG5vZGUgKipwYXJlbnQsc3RydWN0IG5vZGUgKipvdXRwdXQsaW50IHZhbHVlKXsKCWlmKGZpbmFsW3ZhbHVlIC0gMV0gPT0gMSkKCQlyZXR1cm4gMDsKCWZpbmFsW3ZhbHVlIC0gMV0gPSAxOwoJY291bnQrKzsKCXN0cnVjdCBub2RlKiB0ZW1wOwoJdGVtcCA9IHBhcmVudFt2YWx1ZS0xXTsKCXdoaWxlKHRlbXAhPSBOVUxMKXsKCQljb25zdHJ1Y3RGaW5hbChmaW5hbCxwYXJlbnQsb3V0cHV0LHRlbXAtPnZhbHVlKTsKCQl0ZW1wID0gdGVtcC0+bmV4dDsKCX0KfQoKaW50IGZpbmRJbmRleChpbnQgY3VycmVudEVsZW1lbnQsc3RydWN0IG5vZGUqKiBvdXRwdXQsaW50IGxvd2VyLGludCB1cHBlcil7CglpZihsb3dlciA+PSB1cHBlcikKCQlyZXR1cm4gbG93ZXI7CglpbnQgbWlkID1sb3dlciArICggdXBwZXIgLSBsb3dlciApLzI7CglpZihvdXRwdXRbbWlkXS0+dmFsdWUgPCBjdXJyZW50RWxlbWVudCkKCQlyZXR1cm4gZmluZEluZGV4KGN1cnJlbnRFbGVtZW50LG91dHB1dCxtaWQrMSx1cHBlcik7CgllbHNlIGlmKG91dHB1dFttaWRdLT52YWx1ZSA+IGN1cnJlbnRFbGVtZW50KQoJCXJldHVybiBmaW5kSW5kZXgoY3VycmVudEVsZW1lbnQsb3V0cHV0LGxvd2VyLG1pZCk7Cn0JCgppbnQgbWFpbigpewoJaW50IG51bU9mSW5wLHNpemVPZklucCxpLGN1cnJlbnRFbGVtZW50LHNpemVPZk91dCxpbmRleEJpbmFyeSxpbmRleEFkZGVkOwoJc3RydWN0IG5vZGUgKnRlbXAsKnRlbXBJdGVyOwoJbnVtT2ZJbnA9MTsKCXdoaWxlKG51bU9mSW5wLS0pewoJCXNjYW5mKCIlZCIsJnNpemVPZklucCk7CgkJc3RydWN0IG5vZGUgKipvdXRwdXQ7IC8vIGlmIEkgaW5pdGlhbGlzZSBub3JtYWwgaW5pdGlhbGlzYXRpb24sIEkgbWF5IG5vdCBnZXQgdGhlIGRhdGEgYXMgMCBieSBkZWZhdWx0LCBoZW5jZSBjYWxsb2NpbmcKCQlzdHJ1Y3Qgbm9kZSAqKnBhcmVudDsKCQlpbnQgKmlucHV0OwoJCWlucHV0ID0gKGludCAqKWNhbGxvYyhzaXplT2ZJbnAsc2l6ZW9mKGludCkpOwoJCWZvcihpPTAgOyBpPCBzaXplT2ZJbnAgOyBpKyspCgkJCXNjYW5mKCIlZCIsJmlucHV0W2ldKTsKCQkKCQlwYXJlbnQgPSAoc3RydWN0IG5vZGUqKiljYWxsb2Moc2l6ZU9mSW5wLCBzaXplb2Yoc3RydWN0IG5vZGUqKSk7CgkJCgkJb3V0cHV0ID0gKHN0cnVjdCBub2RlKiopY2FsbG9jKHNpemVPZklucCwgc2l6ZW9mKHN0cnVjdCBub2RlKikpOwoJCXNpemVPZk91dCA9IDA7CgkJZm9yKGk9MDtpPHNpemVPZklucDtpKyspewoJCQlpbmRleEJpbmFyeSA9IC0xOwoJCQljdXJyZW50RWxlbWVudCA9IGlucHV0W2ldOwoJCQlpZihzaXplT2ZPdXQgPT0gMCl7CgkJCQlvdXRwdXRbc2l6ZU9mT3V0XSA9IChzdHJ1Y3Qgbm9kZSopY2FsbG9jKDEsc2l6ZW9mKHN0cnVjdCBub2RlKSk7CgkJCQlvdXRwdXRbc2l6ZU9mT3V0XS0+dmFsdWUgPSBjdXJyZW50RWxlbWVudDsKCQkJCWluZGV4QWRkZWQgPSBzaXplT2ZPdXQ7CgkJCQlzaXplT2ZPdXQrKzsKCQkJfQoJCQllbHNlewoJCQkJaWYoY3VycmVudEVsZW1lbnQgPiBvdXRwdXRbc2l6ZU9mT3V0LTFdLT52YWx1ZSl7CgkJCQkJb3V0cHV0W3NpemVPZk91dF0gPSAoc3RydWN0IG5vZGUqKWNhbGxvYygxLHNpemVvZihzdHJ1Y3Qgbm9kZSkpOwoJCQkJCW91dHB1dFtzaXplT2ZPdXRdLT52YWx1ZSA9IGN1cnJlbnRFbGVtZW50OwoJCQkJCWluZGV4QWRkZWQgPSBzaXplT2ZPdXQ7CgkJCQkJc2l6ZU9mT3V0Kys7CgkJCQl9CgkJCQllbHNlewoJCQkJCWluZGV4QmluYXJ5ID0gZmluZEluZGV4KGN1cnJlbnRFbGVtZW50LG91dHB1dCwwLHNpemVPZk91dC0xKTsKCQkJCQl0ZW1wID0gKHN0cnVjdCBub2RlKiljYWxsb2MoMSxzaXplb2Yoc3RydWN0IG5vZGUpKTsKCQkJCQl0ZW1wLT5uZXh0ID0gb3V0cHV0W2luZGV4QmluYXJ5XTsKCQkJCQlvdXRwdXRbaW5kZXhCaW5hcnldID0gdGVtcDsKCQkJCQlvdXRwdXRbaW5kZXhCaW5hcnldLT52YWx1ZSA9IGN1cnJlbnRFbGVtZW50OwoJCQkJCWluZGV4QWRkZWQgPSBpbmRleEJpbmFyeTsKCQkJCX0KCQkJfQoJCQkKCQkJLy9wYXJlbnRbY3VycmVudEVsZW1lbnQtMV0gPSAoc3RydWN0IG5vZGUqKWNhbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsKCQkJaWYoaW5kZXhBZGRlZCA+IDApewoJCQkJdGVtcEl0ZXIgPSBvdXRwdXRbaW5kZXhBZGRlZC0xXTsKCQkJCXdoaWxlKHRlbXBJdGVyICE9IDAgJiYgdGVtcEl0ZXItPnZhbHVlIDwgY3VycmVudEVsZW1lbnQpewkJCQkvL2ZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBwcmV2aW91cyBidWNrZXQKCQkJCQl0ZW1wID0gKHN0cnVjdCBub2RlKiljYWxsb2MoMSxzaXplb2Yoc3RydWN0IG5vZGUpKTsJLy9hZGQgdGhlIHZhbHVlcyB0byBwYXJlbnQKCQkJCQl0ZW1wLT5uZXh0ID0gcGFyZW50W2N1cnJlbnRFbGVtZW50LTFdOwoJCQkJCXBhcmVudFtjdXJyZW50RWxlbWVudC0xXSA9IHRlbXA7CgkJCQkJcGFyZW50W2N1cnJlbnRFbGVtZW50LTFdLT52YWx1ZSA9IHRlbXBJdGVyIC0+dmFsdWU7CgkJCQkJdGVtcEl0ZXIgPSB0ZW1wSXRlci0+bmV4dDsKCQkJCX0KCQkJfQoJCQllbHNlewoJCQkJcGFyZW50W2N1cnJlbnRFbGVtZW50LTFdID0gTlVMTDsJLy8gdGhlc2UgYXJlIHRoZSBlbGVtZW50cyBpbiB0aGUgZmlyc3QgYnVja2V0IG9mIG91dHB1dAoJCQl9CgkJfQoJCQoJCWludCAqZmluYWw7CgkJZmluYWwgPSAoaW50KiljYWxsb2Moc2l6ZU9mSW5wLHNpemVvZihpbnQpKTsKCQl0ZW1wID0gb3V0cHV0W3NpemVPZk91dCAtMV07CgkJY291bnQ9MDsKCQl3aGlsZSh0ZW1wICE9IE5VTEwpewoJCQljb25zdHJ1Y3RGaW5hbChmaW5hbCxwYXJlbnQsb3V0cHV0LHRlbXAtPnZhbHVlKTsKCQkJdGVtcD10ZW1wLT5uZXh0OwoJCX0KCQlwcmludGYoIiVkXG4iLGNvdW50KTsKCQlmb3IoaT0wO2k8c2l6ZU9mSW5wO2krKykKCQkJaWYoZmluYWxbaV09PTEpCgkJCQlwcmludGYoIiVkICIsaSsxKTsKCQlwcmludGYoIlxuIik7CgkJZnJlZShvdXRwdXQpOwoJCWZyZWUocGFyZW50KTsKCQkKCX0KCXJldHVybiAwOwp9