#include <iostream>
#include <algorithm>
#include <vector>
#include <memory>

struct base {
  virtual ~base(){}
  virtual int foo()=0;
};
struct derived_1 : base {
  derived_1() : data(1){}
  int data;
  virtual int foo(){return data++;}
};
struct derived_2 : base {
  derived_2() : data1(1), data2(1) {}
  int data1;
  int data2;
  virtual int foo(){return --data1+ ++data2;}
};

int main()
{
  using namespace std;
  const int howmany  = 10*1000;
  const int howoften = 10*1000;

  vector<unique_ptr<base> > foo;

  for (int i=0; i<howmany; ++i) {
    foo.push_back(unique_ptr<base>(new derived_1()));
    foo.push_back(unique_ptr<base>(new derived_2()));
  }

  int sum = 0;
  for (int i=0; i<howoften; ++i) {
    for (auto& b : foo) {
      sum += b->foo();
    }
  }
  std::cout << sum << '\n';
}

