Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <stack>
- using namespace std;
- vector <int> a, t, r;
- int n;
- ///La idea es que ceil me busque el menor valor que es mayor al dado
- int ceil(int v)
- {
- if(v > a[t[n]])
- return -1;
- int s = 0, e = n;
- while(s+1 < e)
- {
- int m = (s+e)/2;
- if(a[t[m]] > v)
- e = m;
- else
- s = m;
- }
- if(a[t[s]] > v)
- return s;
- return e;
- }
- int main()
- {
- int k;
- while(cin >> k)
- a.push_back(k);
- r = vector <int> (a.size(), -1);
- t.push_back(0);
- n = 0;
- for(int i=1; i<a.size(); i++)
- {
- if(a[i] > a[t[n]])
- {
- r[i] = t[n];
- t.push_back(i);
- n++;
- }
- else
- {
- int p = ceil(a[i]);
- if(p >= 0 && p <= n)
- {
- t[p] = i;
- if(p)
- r[i] = t[p-1];
- }
- }
- }
- stack <int> res;
- int p = t[n];
- while(p != -1)
- {
- res.push(a[p]);
- p = r[p];
- }
- cout << res.size() << endl << "-" << endl;
- while(res.size())
- {
- cout << res.top() << endl;
- res.pop();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment