#include <list>
#include <vector>
#include <algorithm>
#include <iostream>
#include <stdexcept>
using namespace std;
 
void assert(bool result)
{
	if (!result)
		throw std::runtime_error("assert failed");
}
 
void removeOdd(list<int>& li)
{
    for(list<int>::iterator it = li.begin(); it != li.end(); it++)
    {
		//cout << "checking " << *it << endl;
        if ((*it) % 2)
        {
            cout << "erasing " << *it << endl;
            it = li.erase(it);
            cout << "skipping " << *it << endl;
        } 
        else
        {
        	cout << "keeping " << *it << endl;
        }
    }
}
 
void test()
{
    int a[9] = { 5, 2, 8, 9, 6, 7, 3, 4, 1 };
 
    list<int> x(a, a+9);  // construct x from the array
    assert(x.size() == 9 && x.front() == 5 && x.back() == 1);
 
    cout << "before remove: [ ";
    for(int val : x) {
    	cout << val << ' ';
    }
    cout << ']' << endl;
 
    removeOdd(x);
    assert(x.size() == 4);
 
    cout << "after remove: [ ";
    for(int val : x) {
    	cout << val << ' ';
    }
    cout << ']' << endl;
 
    vector<int> v(x.begin(), x.end());  // construct v from x
    sort(v.begin(), v.end());
    cout << "after sort: [ ";
    for(int val : v) {
    	cout << val << ' ';
    }
    cout << ']' << endl;
 
    int expect[4] = { 2, 4, 6, 8 };
    for (int k = 0; k < 4; k++){
        assert(v[k] == expect[k]);
    }
}
 
int main()
{
    test();
    cout << "Passed" << endl;
}
				I2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgYXNzZXJ0KGJvb2wgcmVzdWx0KQp7CglpZiAoIXJlc3VsdCkKCQl0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImFzc2VydCBmYWlsZWQiKTsKfQoKdm9pZCByZW1vdmVPZGQobGlzdDxpbnQ+JiBsaSkKewogICAgZm9yKGxpc3Q8aW50Pjo6aXRlcmF0b3IgaXQgPSBsaS5iZWdpbigpOyBpdCAhPSBsaS5lbmQoKTsgaXQrKykKICAgIHsKCQkvL2NvdXQgPDwgImNoZWNraW5nICIgPDwgKml0IDw8IGVuZGw7CiAgICAgICAgaWYgKCgqaXQpICUgMikKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgImVyYXNpbmcgIiA8PCAqaXQgPDwgZW5kbDsKICAgICAgICAgICAgaXQgPSBsaS5lcmFzZShpdCk7CiAgICAgICAgICAgIGNvdXQgPDwgInNraXBwaW5nICIgPDwgKml0IDw8IGVuZGw7CiAgICAgICAgfSAKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgIAljb3V0IDw8ICJrZWVwaW5nICIgPDwgKml0IDw8IGVuZGw7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHRlc3QoKQp7CiAgICBpbnQgYVs5XSA9IHsgNSwgMiwgOCwgOSwgNiwgNywgMywgNCwgMSB9OwoKICAgIGxpc3Q8aW50PiB4KGEsIGErOSk7ICAvLyBjb25zdHJ1Y3QgeCBmcm9tIHRoZSBhcnJheQogICAgYXNzZXJ0KHguc2l6ZSgpID09IDkgJiYgeC5mcm9udCgpID09IDUgJiYgeC5iYWNrKCkgPT0gMSk7CgogICAgY291dCA8PCAiYmVmb3JlIHJlbW92ZTogWyAiOwogICAgZm9yKGludCB2YWwgOiB4KSB7CiAgICAJY291dCA8PCB2YWwgPDwgJyAnOwogICAgfQogICAgY291dCA8PCAnXScgPDwgZW5kbDsKCiAgICByZW1vdmVPZGQoeCk7CiAgICBhc3NlcnQoeC5zaXplKCkgPT0gNCk7CgogICAgY291dCA8PCAiYWZ0ZXIgcmVtb3ZlOiBbICI7CiAgICBmb3IoaW50IHZhbCA6IHgpIHsKICAgIAljb3V0IDw8IHZhbCA8PCAnICc7CiAgICB9CiAgICBjb3V0IDw8ICddJyA8PCBlbmRsOwoKICAgIHZlY3RvcjxpbnQ+IHYoeC5iZWdpbigpLCB4LmVuZCgpKTsgIC8vIGNvbnN0cnVjdCB2IGZyb20geAogICAgc29ydCh2LmJlZ2luKCksIHYuZW5kKCkpOwogICAgY291dCA8PCAiYWZ0ZXIgc29ydDogWyAiOwogICAgZm9yKGludCB2YWwgOiB2KSB7CiAgICAJY291dCA8PCB2YWwgPDwgJyAnOwogICAgfQogICAgY291dCA8PCAnXScgPDwgZW5kbDsKCiAgICBpbnQgZXhwZWN0WzRdID0geyAyLCA0LCA2LCA4IH07CiAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKyl7CiAgICAgICAgYXNzZXJ0KHZba10gPT0gZXhwZWN0W2tdKTsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICB0ZXN0KCk7CiAgICBjb3V0IDw8ICJQYXNzZWQiIDw8IGVuZGw7Cn0=