/*
given an array of size n...
create an array of size n such that ai where ai is the element in the
new array at index location i is equal to sum of all elements in
original array which are smaller than element at posn i...
e.g
ar[]={3,5,1,6,7,8};
ar1[]={0,3,0,9,15,22};
*/
#include<stdio.h>
#include<stdlib.h>
struct node{
int data;
struct node *left,*right;
int lcount;
int k;
};
struct node* newnode(int data,int d)
{
struct node *node=(struct node*)malloc(sizeof(struct node));
node->data=data;
node->left=node->right=NULL;
node->lcount=d;
node->k=0;
return node;
}
struct node* insert(struct node *root,int data,int *d)
{
if(root==NULL)
{
root=newnode(data,*d);
return root;
}
if(root->data>data)
{
root->k +=data;
//left subtree
root->left=insert(root->left,data,d);
}
else if(root->data < data)
{
// right case
*d=*d+root->data+root->k;
root->right=insert(root->right,data,d);
}
return root;
}
void inorder(struct node *root)
{
if(root!=NULL)
{
inorder(root->left);
printf(" value->%d ,lcount ->%d\n",root->data,root->lcount);
inorder(root->right);
}
}
int main()
{
int a[]={3,5,1,6,7,2};
struct node *root=NULL;
for(int i=0;i<6;i++)
{int d=0;
root=insert(root,a[i],&d);
printf("value-> %d.... sum %d\n",a[i],d);
}
//inorder(root);
return 0;
}
LyoKZ2l2ZW4gYW4gYXJyYXkgb2Ygc2l6ZSBuLi4uCmNyZWF0ZSBhbiBhcnJheSBvZiBzaXplIG4gc3VjaCB0aGF0IGFpIHdoZXJlIGFpIGlzIHRoZSBlbGVtZW50IGluIHRoZQpuZXcgYXJyYXkgYXQgaW5kZXggbG9jYXRpb24gaSBpcyBlcXVhbCB0byBzdW0gb2YgYWxsIGVsZW1lbnRzIGluCm9yaWdpbmFsIGFycmF5IHdoaWNoIGFyZSBzbWFsbGVyIHRoYW4gZWxlbWVudCBhdCBwb3NuIGkuLi4KZS5nCmFyW109ezMsNSwxLDYsNyw4fTsKYXIxW109ezAsMywwLDksMTUsMjJ9OwoqLwojaW5jbHVkZTxzdGRpby5oPgojaW5jbHVkZTxzdGRsaWIuaD4Kc3RydWN0IG5vZGV7CmludCBkYXRhOwpzdHJ1Y3Qgbm9kZSAqbGVmdCwqcmlnaHQ7CmludCBsY291bnQ7CmludCBrOwp9OwpzdHJ1Y3Qgbm9kZSogbmV3bm9kZShpbnQgZGF0YSxpbnQgZCkKewpzdHJ1Y3Qgbm9kZSAqbm9kZT0oc3RydWN0IG5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsKbm9kZS0+ZGF0YT1kYXRhOwpub2RlLT5sZWZ0PW5vZGUtPnJpZ2h0PU5VTEw7Cm5vZGUtPmxjb3VudD1kOwpub2RlLT5rPTA7CnJldHVybiBub2RlOwp9CnN0cnVjdCBub2RlKiBpbnNlcnQoc3RydWN0IG5vZGUgKnJvb3QsaW50IGRhdGEsaW50ICpkKQp7CmlmKHJvb3Q9PU5VTEwpCnsKcm9vdD1uZXdub2RlKGRhdGEsKmQpOwpyZXR1cm4gcm9vdDsKfQppZihyb290LT5kYXRhPmRhdGEpCnsKcm9vdC0+ayArPWRhdGE7Ci8vbGVmdCBzdWJ0cmVlCnJvb3QtPmxlZnQ9aW5zZXJ0KHJvb3QtPmxlZnQsZGF0YSxkKTsKfQplbHNlIGlmKHJvb3QtPmRhdGEgPCBkYXRhKQogICAgICB7CiAgICAgICAvLyByaWdodCBjYXNlCiAgICAgICAqZD0qZCtyb290LT5kYXRhK3Jvb3QtPms7ICAgICAgICAKICAgICAgIHJvb3QtPnJpZ2h0PWluc2VydChyb290LT5yaWdodCxkYXRhLGQpOwogICAgICAgfQpyZXR1cm4gcm9vdDsKfQp2b2lkIGlub3JkZXIoc3RydWN0IG5vZGUgKnJvb3QpCnsKaWYocm9vdCE9TlVMTCkKewppbm9yZGVyKHJvb3QtPmxlZnQpOwpwcmludGYoIiB2YWx1ZS0+JWQgLGxjb3VudCAtPiVkXG4iLHJvb3QtPmRhdGEscm9vdC0+bGNvdW50KTsKaW5vcmRlcihyb290LT5yaWdodCk7Cn0KfQppbnQgbWFpbigpCnsKaW50IGFbXT17Myw1LDEsNiw3LDJ9OwpzdHJ1Y3Qgbm9kZSAqcm9vdD1OVUxMOwpmb3IoaW50IGk9MDtpPDY7aSsrKQp7aW50IGQ9MDsKcm9vdD1pbnNlcnQocm9vdCxhW2ldLCZkKTsKcHJpbnRmKCJ2YWx1ZS0+ICVkLi4uLiBzdW0gJWRcbiIsYVtpXSxkKTsKfQovL2lub3JkZXIocm9vdCk7CnJldHVybiAwOwp9Cgo=