Pagini recente » Cod sursa (job #2804982) | Cod sursa (job #2980479) | Cod sursa (job #2039099) | Cod sursa (job #922315) | Cod sursa (job #3262012)
#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 1e5 + 1;
int N;
int v[N_MAX];
vector<int> dp;
int t[N_MAX];
void SetInput(string name)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
(void)!freopen((name + ".in").c_str(), "r", stdin);
(void)!freopen((name + ".out").c_str(), "w", stdout);
}
void ReadArray()
{
cin >> N;
for(int i = 0; i < N; i++)
cin >> v[i];
}
int LowestGreaterPos(int& x) /// find the first position in dp with it's value in v greater or equal to x
{
int L = 0, R = (int)dp.size() - 1, m;
int ans = -1;
while(L <= R)
{
m = (L + R) / 2;
if(v[dp[m]] >= x)
{
ans = m;
R = m - 1;
}
else
L = m + 1;
}
return ans;
}
void DisplayPath(int i)
{
if(t[i] != -1)
DisplayPath(t[i]);
cout << v[i] << ' ';
}
void Solve()
{
dp.push_back(0);
t[0] = -1;
for(int i = 1, pos; i < N; i++)
{
if(v[i] > v[dp.back()])
{
pos = dp.size();
dp.push_back(i);
}
else
{
pos = LowestGreaterPos(v[i]);
dp[LowestGreaterPos(v[i])] = i;
}
if(pos >= 1)
t[i] = dp[pos - 1];
else
t[i] = -1;
}
cout << dp.size() << '\n';
DisplayPath(dp.back());
cout << '\n';
}
int main()
{
SetInput("scmax");
ReadArray();
Solve();
return 0;
}