#include <chrono>
#include <condition_variable>
#include <iostream>
#include <memory>
#include <mutex>
#include <thread>

int subtask1(int x) {
  std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  return x;
}

int subtask2(int x) {
  std::this_thread::sleep_for(std::chrono::milliseconds(500));
  return x;
}

struct Sync {
  std::mutex m;
  std::condition_variable cv;
  bool result1_ready = false;
  int result1;
};

int run(int a, int b) {
  auto sync = std::make_shared<Sync>();

  std::thread t([a, sync]() {
    int tmp = subtask1(a);

    std::lock_guard<std::mutex> lock(sync->m);
    sync->result1 = tmp;
    sync->result1_ready = true;
    sync->cv.notify_all();
  });
  t.detach();

  int result2 = subtask2(b);
  if (result2 < 0) {
    return -2;
  }

  std::unique_lock<std::mutex> lock(sync->m);
  sync->cv.wait(lock, [&]() { return sync->result1_ready; });
  if (sync->result1 < 0) {
    return -1;
  }

  return 0;
}

int main(int argc, char **argv) {
  if (argc < 3) {
    std::cerr << "usage: " << argv[0] << " [int] [int]" << std::endl;
    return 1;
  }

  std::cout << run(std::stoi(argv[1]), std::stoi(argv[2])) << std::endl;
  return 0;
}
