Pagini recente » Cod sursa (job #2804617) | Cod sursa (job #1503385) | Cod sursa (job #675549) | Cod sursa (job #248816) | Cod sursa (job #2971880)
// O(N logN)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 1e5;
const int INF = 2e9 + 1;
int n;
int v[NMAX + 1];
int tr[NMAX + 1], ind[NMAX + 1];
int dp[NMAX + 1]; // dp[i] = elementul terminal al unui subsir crescator de lungime i
vector<int> ans;
int main() {
fin >> n;
for(int i = 1; i <= n; i++) {
fin >> v[i];
}
for(int i = 1; i <= n; i++) {
dp[i] = INF;
}
dp[0] = -INF;
for(int i = 1; i <= n; i++) {
int j = upper_bound(dp, dp + n + 1, v[i]) - dp; // cea mai mica pozitie pentru care dp[j] > v[i]
if(dp[j - 1] < v[i]) {
if(v[i] < dp[j]) {
dp[j] = v[i];
ind[j] = i;
tr[i] = ind[j - 1];
}
}
}
int len = 1;
for(int i = 2; i <= n && dp[i] < INF; i++) {
len = i;
}
fout << len << '\n';
int pos = ind[len];
while(pos > 0) {
ans.push_back(pos);
pos = tr[pos];
}
reverse(ans.begin(), ans.end());
for(int i = 0; i < (int) ans.size(); i++) {
fout << v[ans[i]] << " ";
}
return 0;
}