#include <cstdio>
#include <cstring>
#include <cstdlib>

struct vli_st {
  unsigned char *digits;
  size_t count;
};

void vli_print(vli_st &a) {
  for(size_t i = a.count; i > 0; i--) {
    putchar('0' + a.digits[i - 1]);
  }

  putchar('\n');
}

void vli_add(vli_st &dst, vli_st &a, vli_st &b) {

  size_t max_count = a.count > b.count ? a.count : b.count;
  dst.count = max_count + 1;
  dst.digits = new unsigned char[dst.count];
  memset(dst.digits, 0, dst.count);

  for(size_t i = 0; i < max_count; i++) {
    if(i < a.count) dst.digits[i] += a.digits[i];
    if(i < b.count) dst.digits[i] += b.digits[i];

    dst.digits[i + 1] = dst.digits[i] / 10;
    dst.digits[i] %= 10;
  }
}

int main(void) {

  unsigned char vli_a_digits[] = {
    8, 4, 5, 5, 7, 2, 4, 5, 2, 5, 1, 9, 8, 4, 3, 4, 5, 7, 5, 6, 7
  };

  unsigned char vli_b_digits[] = {
    9, 7, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 3, 3, 5, 9
  };

  vli_st a = { vli_a_digits, sizeof(vli_a_digits) };
  vli_st b = { vli_b_digits, sizeof(vli_b_digits) };
  vli_st c = { NULL, 0 };

  vli_print(a);
  vli_print(b);

  vli_add(c, a, b);

  vli_print(c);

  return 0;
}

