Pagini recente » Cod sursa (job #371324) | Cod sursa (job #491347) | Cod sursa (job #2561025) | Cod sursa (job #2954230) | Cod sursa (job #1724818)
#include <bits/stdc++.h>
using namespace std;
struct el
{
int poz, val;
bool operator<(const el&A)const
{
return val < A.val;
}
};
int a[100005], dp[100005], n, aib[100005], rez[100005], vect[100005];
el v[100005];
inline void Read()
{
ifstream fin("scmax.in");
fin >> n;
for(int i = 1; i <= n; i++)
fin >> a[i], vect[i] = a[i];
fin.close();
}
inline void Normalizare()
{
int i;
for(i = 1; i <= n; i++)
{
v[i].val = a[i];
v[i].poz = i;
}
sort(v + 1, v + 1 + n);
a[v[1].poz] = 1;
for(i = 2; i <= n; i++)
{
a[v[i].poz] = a[v[i - 1].poz];
if(v[i].val > v[i - 1].val)
++a[v[i].poz];
}
}
inline void Update(int poz, int val)
{
int i;
for(i = poz; i <= n; i += (i & (-i)))
if(val > aib[i])
aib[i] = val;
}
int Query(int poz)
{
int i, sol;
sol = 0;
for(i = poz; i >= 1; i -= (i & (-i)))
if(aib[i] > sol)
sol = aib[i];
return sol;
}
inline void Solve()
{
int i, sol, lg, last, cnt, k;
for(i = 1; i <= n; i++)
{
dp[i] = 1 + Query(a[i] - 1);
Update(a[i], dp[i]);
}
sol = 0;
k = 0;
for(i = 1; i <= n; i++)
if(dp[i] > sol)
sol = dp[i], k = i;
lg = dp[k];
last = vect[k];
cnt = 0;
rez[++cnt] = last;
for(i = k; i >= 1; i--)
{
if(dp[i] == lg - 1 && vect[i] < last)
{
lg--;
last = vect[i];
rez[++cnt] = last;
}
}
ofstream fout("scmax.out");
fout << sol << "\n";
for(i = cnt; i >= 1; i--)
fout << rez[i] << " ";
fout << "\n";
fout.close();
}
int main()
{
Read();
Normalizare();
Solve();
return 0;
}