Problem p02285 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <cmath>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long lli;
typedef vector<lli> vll;
typedef vector<bool> vbl;
typedef vector<vector<lli>> mat;
typedef vector<vector<bool>> matb;
typedef vector<string> vst;
typedef pair<lli, lli> pll;
typedef pair<double, double> pdd;

lli n;

mat t;
vll v;
lli c;
string s;
lli x;
lli r = 0;

void insert(lli x, lli i) {
  if (x < v[i]) {
    if (t[i][0] >= 0)
      insert(x, t[i][0]);
    else
      t[i][0] = c;
  } else {
    if (t[i][1] >= 0)
      insert(x, t[i][1]);
    else
      t[i][1] = c;
  }
}
bool find(lli x, lli i) {
  if (x == v[i])
    return true;
  if (x < v[i]) {
    if (t[i][0] >= 0)
      return find(x, t[i][0]);
    else
      return false;
  } else {
    if (t[i][1] >= 0)
      return find(x, t[i][1]);
    else
      return false;
  }
}

void del(lli x, lli &i) {
  // cout << x << " " << i << endl;
  if (x == v[i]) {
    if (t[i][0] < 0 && t[i][1] < 0)
      i = -1;
    else if (t[i][0] < 0)
      i = t[i][1];
    else if (t[i][1] < 0)
      i = t[i][0];
    else {
      lli j = t[i][1];
      lli k = i;
      lli l = 1;
      while (t[j][0] >= 0)
        l = 0, k = j, j = t[j][0];
      v[i] = v[j];
      del(v[j], t[k][l]);
    }
    return;
  }
  if (x < v[i]) {
    if (t[i][0] >= 0)
      return del(x, t[i][0]);
    else
      return;
  } else {
    if (t[i][1] >= 0)
      return del(x, t[i][1]);
    else
      return;
  }
}

void inorder(lli i) {
  if (t[i][0] >= 0)
    inorder(t[i][0]);
  cout << " " << v[i];
  if (t[i][1] >= 0)
    inorder(t[i][1]);
}

void preorder(lli i) {
  cout << " " << v[i];
  if (t[i][0] >= 0)
    preorder(t[i][0]);
  if (t[i][1] >= 0)
    preorder(t[i][1]);
}

int main() {
  cin >> n;
  t = mat(n, vll(2, -1));
  v = vll(n);
  for (lli i = 0; i < n; i++) {
    cin >> s;
    if (s == "insert") {
      cin >> x;
      v[c] = x;
      if (i)
        insert(x, r);
      c++;
    } else if (s == "print") {
      inorder(r);
      cout << endl;
      preorder(r);
      cout << endl;
    } else if (s == "find") {
      cin >> x;
      cout << (find(x, r) ? "yes" : "no") << endl;
    } else if (s == "delete") {
      cin >> x;
      del(x, r);
    }
  }

  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <cmath>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long lli;
typedef vector<lli> vll;
typedef vector<bool> vbl;
typedef vector<vector<lli>> mat;
typedef vector<vector<bool>> matb;
typedef vector<string> vst;
typedef pair<lli, lli> pll;
typedef pair<double, double> pdd;

lli n;

mat t;
vll v;
lli c;
string s;
lli x;
lli r = 0;

void insert(lli x, lli i) {
  if (x < v[i]) {
    if (t[i][0] >= 0)
      insert(x, t[i][0]);
    else
      t[i][0] = c;
  } else {
    if (t[i][1] >= 0)
      insert(x, t[i][1]);
    else
      t[i][1] = c;
  }
}
bool find(lli x, lli i) {
  if (x == v[i])
    return true;
  if (x < v[i]) {
    if (t[i][0] >= 0)
      return find(x, t[i][0]);
    else
      return false;
  } else {
    if (t[i][1] >= 0)
      return find(x, t[i][1]);
    else
      return false;
  }
}

void del(lli x, lli &i) {
  if (x == v[i]) {
    if (t[i][0] == -1 && t[i][1] == -1)
      i = -1;
    else if (t[i][0] == -1)
      i = t[i][1];
    else if (t[i][1] == -1)
      i = t[i][0];
    else {
      i = t[i][1];
      del(v[t[i][1]], t[i][1]);
    }
    return;
  }
  if (x < v[i]) {
    if (t[i][0] >= 0)
      return del(x, t[i][0]);
    else
      return;
  } else {
    if (t[i][1] >= 0)
      return del(x, t[i][1]);
    else
      return;
  }
}

void inorder(lli i) {
  if (t[i][0] >= 0)
    inorder(t[i][0]);
  cout << " " << v[i];
  if (t[i][1] >= 0)
    inorder(t[i][1]);
}

void preorder(lli i) {
  cout << " " << v[i];
  if (t[i][0] >= 0)
    preorder(t[i][0]);
  if (t[i][1] >= 0)
    preorder(t[i][1]);
}

int main() {
  cin >> n;
  t = mat(n, vll(2, -1));
  v = vll(n);
  for (lli i = 0; i < n; i++) {
    cin >> s;
    if (s == "insert") {
      cin >> x;
      v[c] = x;
      if (i)
        insert(x, r);
      c++;
    } else if (s == "print") {
      inorder(r);
      cout << endl;
      preorder(r);
      cout << endl;
    } else if (s == "find") {
      cin >> x;
      cout << (find(x, r) ? "yes" : "no") << endl;
    } else if (s == "delete") {
      cin >> x;
      del(x, r);
    }
  }

  return 0;
}