Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- #include <deque>
- #include <stack>
- #include <algorithm>
- int main()
- {
- unsigned n = 0;
- std::scanf("%u", &n);
- std::deque<unsigned> pn(n, 0);
- for (unsigned& i : pn) scanf("%u", &i);
- std::vector<unsigned> sorts(n, 0);
- std::copy(pn.begin(), pn.end(), sorts.begin());
- std::sort(sorts.begin(), sorts.end());
- std::stack<unsigned> keep;
- std::vector<std::pair<unsigned, unsigned>> ans;
- for (unsigned i = 0; i < n; i++)
- {
- unsigned count = 0;
- if (!keep.empty() && keep.top() == sorts[i]) goto FIND;
- while (!pn.empty() && sorts[i] != pn[0])
- {
- keep.push(pn[0]);
- pn.pop_front();
- count++;
- }
- if (!pn.empty()) // т.е. мы нашли наименьший в pn
- {
- pn.pop_front(); // больше он не нужен
- count++;
- std::pair<unsigned, unsigned> f(1, count);
- std::pair<unsigned, unsigned> s(2, 1);
- ans.push_back(f);
- ans.push_back(s);
- }
- else // pn пуст, значит pair(1,n) больше не будет
- {
- if (keep.top() != sorts[i])
- {
- std::puts("0");
- goto END; // лень юзать bool, так быстрее во всех смыслах
- }
- else
- {
- FIND:
- keep.pop(); // т.е. мы нашли наименьший в keep
- ans[ans.size() - 1].second++;
- }
- }
- }
- for (const std::pair<unsigned, unsigned> an : ans)
- std::printf("%u %u\n", an.first, an.second);
- END:return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement