#include #include using namespace std; class ducks { public: int *duckStart; int *duckEnd; int *data; int rounds; ducks(int*data, int size) : data(data) { duckStart = data; duckEnd = duckStart + size; rounds = 0; } void count() { int *lp = duckStart; int *rp = duckEnd - 1; while (duckEnd - duckStart > 1 && rp >= duckStart && lp < duckEnd) { map lpos; map rpos; lp = duckStart; rp = duckEnd - 1; while (rp >= duckStart && lp < duckEnd) { if (lp >= rp) { ducks dl(duckStart, lp - duckStart); ducks dr(rp, lp - duckStart); dl.count(); dr.count(); rounds += dl.rounds > dr.rounds ? dl.rounds : dr.rounds; return; } if (rpos.find(*lp) == rpos.end()) { if (lpos.find(*lp) == lpos.end()) { int val = *lp; lpos.emplace(val, lp); //cout << "found left " << val << endl; } } else { rounds++; duckStart = lp + 1; duckEnd = rpos.find(*lp)->second - 1; break; } if (lpos.find(*rp) == lpos.end()) { if (rpos.find(*rp) == rpos.end()) { int val = *rp; rpos.emplace(val, rp); //cout << "found from right" << val << endl; } } else { rounds++; duckEnd = rp; duckStart = lpos.find(*rp)->second + 1; break; } lp++; rp--; } } } }; int main() { ios::sync_with_stdio(false); int count; while (cin >> count) { int data[count]; for (int i = 0; i < count; i++) cin >> data[i]; ducks d(data, count); d.count(); cout << d.rounds << '\n'; } return 0; }