Cod sursa(job #2313300)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 6 ianuarie 2019 16:47:05
Problema Nums Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <bits/stdc++.h>

using namespace std;
#define ARRAY_SIZE(arr) sizeof(arr)/sizeof(arr[0])

typedef struct node_t node_t;

struct node_t
{
    int data;
    int lCount;

    node_t* left;
    node_t* right;
};

node_t *insert_node(node_t *root, node_t* node)
{
    /* A crawling pointer */
    node_t *pTraverse = root;
    node_t *currentParent = root;

    // Traverse till appropriate node
    while(pTraverse)
    {
        currentParent = pTraverse;

        if( node->data < pTraverse->data )
        {
            /* We are branching to left subtree
               increment node count */
            pTraverse->lCount++;
            /* left subtree */
            pTraverse = pTraverse->left;
        }
        else
        {
            /* right subtree */
            pTraverse = pTraverse->right;
        }
    }

    /* If the tree is empty, make it as root node */
    if( !root )
    {
        root = node;
    }
    else if( node->data < currentParent->data )
    {
        /* Insert on left side */
        currentParent->left = node;
    }
    else
    {
        /* Insert on right side */
        currentParent->right = node;
    }

    return root;
}

int k_smallest_element(node_t *root, int k)
{
    int ret = -1;

    if( root )
    {
        /* A crawling pointer */
        node_t *pTraverse = root;

        /* Go to k-th smallest */
        while(pTraverse)
        {
            if( (pTraverse->lCount + 1) == k )
            {
                ret = pTraverse->data;
                break;
            }
            else if( k > pTraverse->lCount )
            {
                /*  There are less nodes on left subtree
                    Go to right subtree */
                k = k - (pTraverse->lCount + 1);
                pTraverse = pTraverse->right;
            }
            else
            {
                /* The node is on left subtree */
                pTraverse = pTraverse->left;
            }
        }
    }

    return ret;
}

int main() {
  int a, q, tip, k;
  freopen ("nums.in", "r", stdin);
  freopen ("nums.out", "w", stdout);
  scanf ("%d", &q);
  node_t* root = NULL;
  while (q--) {
    scanf ("%d", &tip);
    if (tip == 1) {
      scanf ("%d", &a);
      node_t* new_node = NULL;
      new_node = (node_t *)malloc( sizeof(node_t) );
      new_node->data   = a;
      new_node->lCount = 0;
      new_node->left   = NULL;
      new_node->right  = NULL;
      /* insert into BST */
      root = insert_node(root, new_node);
    }
    else {
      scanf ("%d", &k);
      printf ("%d\n", k_smallest_element (root, k));
    }
  }
  return 0;
}