Pagini recente » Cod sursa (job #1897513) | Cod sursa (job #2325681) | Cod sursa (job #69217) | Cod sursa (job #1604208) | Cod sursa (job #2988075)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int MaxN = 100005;
int n, a[MaxN], ans = 1, dp[MaxN], v[MaxN], last[MaxN];
pair<int, int>b[MaxN];
pair<int, int>aib[MaxN];
void Update(int p, int val){
for(int i = a[p]; i <= n; i += (i & (-i)))
if(val > aib[i].first)
aib[i] = {val, p};
}
int Query(int p){
int s = 0, pMax = 0;
for(p; p > 0; p -= (p & (-p)))
if(aib[p].first > s){
s = aib[p].first;
pMax = aib[p].second;
}
return pMax;
}
void Afis(int x){
if(last[x] != 0)
Afis(last[x]);
fout << v[x] << " ";
}
int main()
{
int poz = 1;
fin >> n;
for(int i = 1; i <= n; i++){
fin >> a[i], b[i] = { a[i], i };
v[i] = a[i];
}
sort(b + 1, b + n + 1);
int val = 1;
a[b[1].second] = 1;
for(int i = 2; i <= n; i++){
if(b[i].first != b[i - 1].first)
val++;
a[b[i].second] = val;
}
for(int i = 1; i <= n; i++){
dp[i] = max(dp[i], dp[Query(a[i] - 1)] + 1);
Update(i, dp[i]);
last[i] = Query(a[i] - 1);
if(ans < dp[i]){
ans = dp[i];
poz = i;
}
}
fout << ans << "\n";
Afis(poz);
return 0;
}