Problem p00909 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;

#define fi first
#define se second
#define repl(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++)
#define rep(i, n) repl(i, 0, n)
#define all(x) (x).begin(), (x).end()
#define dbg(x) cout << #x "=" << x << endl
#define mmax(x, y) (x > y ? x : y)
#define mmin(x, y) (x < y ? x : y)
#define maxch(x, y) x = mmax(x, y)
#define minch(x, y) x = mmin(x, y)
#define uni(x) x.erase(unique(all(x)), x.end())
#define exist(x, y) (find(all(x), y) != x.end())
#define bcnt __builtin_popcount

#define INF 1e16
#define mod 1000000007

ll n, m;
vector<ll> par, sz, dep;
vector<vector<ll>> child;

ll find(ll x) {
  if (par[x] == -1)
    return x;
  else
    return find(par[x]);
}

void rec(ll v, ll pre, ll add) {
  dep[v] += add;
  for (ll nv : child[v]) {
    if (nv == v)
      continue;
    rec(nv, v, add);
  }
}

int main() {
  while (1) {
    cin >> n >> m;
    if (n == 0)
      break;
    par.resize(n);
    sz.resize(n);
    dep.resize(n);
    child.resize(n);
    rep(i, n) {
      par[i] = -1;
      sz[i] = 1;
      dep[i] = 0;
    }
    rep(i, m) {
      char t;
      cin >> t;
      if (t == '!') {
        ll a, b, c;
        cin >> a >> b >> c;
        a--;
        b--;
        ll pa = find(a);
        ll pb = find(b);
        if (pa == pb)
          continue;
        if (sz[pa] < sz[pb]) {
          swap(pa, pb);
          swap(a, b);
          c = -c;
        }
        par[pb] = pa;
        ll x = dep[a] - dep[b] + c;
        rec(pb, pa, x);
        child[pa].push_back(pb);
        sz[pa] += sz[pb];
      } else {
        ll a, b;
        cin >> a >> b;
        a--;
        b--;
        ll pa = find(a);
        ll pb = find(b);
        if (pa != pb) {
          cout << "UNKNOWN" << endl;
        } else {
          cout << -dep[a] + dep[b] << endl;
        }
      }
    }
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;

#define fi first
#define se second
#define repl(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++)
#define rep(i, n) repl(i, 0, n)
#define all(x) (x).begin(), (x).end()
#define dbg(x) cout << #x "=" << x << endl
#define mmax(x, y) (x > y ? x : y)
#define mmin(x, y) (x < y ? x : y)
#define maxch(x, y) x = mmax(x, y)
#define minch(x, y) x = mmin(x, y)
#define uni(x) x.erase(unique(all(x)), x.end())
#define exist(x, y) (find(all(x), y) != x.end())
#define bcnt __builtin_popcount

#define INF 1e16
#define mod 1000000007

ll n, m;
vector<ll> par, sz, dep;
vector<vector<ll>> child;

ll find(ll x) {
  if (par[x] == -1)
    return x;
  else
    return find(par[x]);
}

void rec(ll v, ll pre, ll add) {
  dep[v] += add;
  for (ll nv : child[v]) {
    if (nv == v)
      continue;
    rec(nv, v, add);
  }
}

int main() {
  while (1) {
    cin >> n >> m;
    if (n == 0)
      break;
    par.resize(n);
    sz.resize(n);
    dep.resize(n);
    child.resize(n);
    rep(i, n) {
      par[i] = -1;
      sz[i] = 1;
      dep[i] = 0;
      child[i].clear();
    }
    rep(i, m) {
      char t;
      cin >> t;
      if (t == '!') {
        ll a, b, c;
        cin >> a >> b >> c;
        a--;
        b--;
        ll pa = find(a);
        ll pb = find(b);
        if (pa == pb)
          continue;
        if (sz[pa] < sz[pb]) {
          swap(pa, pb);
          swap(a, b);
          c = -c;
        }
        par[pb] = pa;
        ll x = dep[a] - dep[b] + c;
        rec(pb, pa, x);
        child[pa].push_back(pb);
        sz[pa] += sz[pb];
      } else {
        ll a, b;
        cin >> a >> b;
        a--;
        b--;
        ll pa = find(a);
        ll pb = find(b);
        if (pa != pb) {
          cout << "UNKNOWN" << endl;
        } else {
          cout << -dep[a] + dep[b] << endl;
        }
      }
    }
  }
  return 0;
}