// Problem 17 from FCCPP

#include <iostream>
#include <list>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <queue>
#include <deque>

using namespace std;

template <class Src>
void RAND_ELEMENTS(Src& l1, int n) {
    l1.clear();
    for(int i = 0; i < 100; ++i)
        l1.push_back(rand()%100);
}

template <class Src, class T>
Src find(Src i, Src j, const T& t) {
    while (i != j && *i != t) ++i;
    return i;
}

int main()
{
    srand(unsigned(time(0)));
    vector<int> l1;
    RAND_ELEMENTS(l1,100);
    for(auto it = l1.begin(); it != l1.end(); ++it)
        cout << *it << " ";
    cout << "\nLooking for 10: " << *find(l1.begin(),l1.end(),10);
    cout << "\nLooking for 20: " << *find(l1.begin(),l1.end(),20) << endl;

    list<int> l2;
    RAND_ELEMENTS(l2,100);
    for(auto it = l2.begin(); it != l2.end(); ++it)
        cout << *it << " ";
    cout << endl;
    cout << "\nLooking for 10: " << *find(l2.begin(),l2.end(),10) << endl;
    cout << "\nLooking for 20: " << *find(l2.begin(),l2.end(),20) << endl;

    deque<int> l3;
    RAND_ELEMENTS(l3,100);
    for(auto it = l3.begin(); it != l3.end(); ++it)
        cout << *it << " ";
    cout << endl;
    cout << "\nLooking for 10: " << *find(l3.begin(),l3.end(),10) << endl;
    cout << "\nLooking for 20: " << *find(l3.begin(),l3.end(),20) << endl;
    return 0;
}
