GastonFontenla

UVa: 481 - What goes up

May 28th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.26 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stack>
  4.  
  5. using namespace std;
  6.  
  7. vector <int> a, t, r;
  8. int n;
  9.  
  10. ///La idea es que ceil me busque el menor valor que es mayor al dado
  11. int ceil(int v)
  12. {
  13.     if(v > a[t[n]])
  14.         return -1;
  15.     int s = 0, e = n;
  16.     while(s+1 < e)
  17.     {
  18.         int m = (s+e)/2;
  19.         if(a[t[m]] > v)
  20.             e = m;
  21.         else
  22.             s = m;
  23.     }
  24.     if(a[t[s]] > v)
  25.         return s;
  26.     return e;
  27. }
  28.  
  29. int main()
  30. {
  31.     int k;
  32.     while(cin >> k)
  33.         a.push_back(k);
  34.  
  35.     r = vector <int> (a.size(), -1);
  36.     t.push_back(0);
  37.     n = 0;
  38.  
  39.     for(int i=1; i<a.size(); i++)
  40.     {
  41.         if(a[i] > a[t[n]])
  42.         {
  43.             r[i] = t[n];
  44.             t.push_back(i);
  45.             n++;
  46.         }
  47.         else
  48.         {
  49.             int p = ceil(a[i]);
  50.             if(p >= 0 && p <= n)
  51.             {
  52.                 t[p] = i;
  53.                 if(p)
  54.                     r[i] = t[p-1];
  55.             }
  56.         }
  57.     }
  58.  
  59.     stack <int> res;
  60.     int p = t[n];
  61.     while(p != -1)
  62.     {
  63.         res.push(a[p]);
  64.         p = r[p];
  65.     }
  66.  
  67.     cout << res.size() << endl << "-" << endl;
  68.     while(res.size())
  69.     {
  70.         cout << res.top() << endl;
  71.         res.pop();
  72.     }
  73.  
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment