Pagini recente » Cod sursa (job #698153) | Cod sursa (job #2687249) | Cod sursa (job #697424) | Cod sursa (job #1650665) | Cod sursa (job #2574709)
#include <bits/stdc++.h>
#define N_MAX 100005
#define lsb(i) ((i & (i - 1)) ^ i)
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
unsigned int N, a[N_MAX], Val[N_MAX];
pair < int, int > v[N_MAX];
map < int, int > Poz;
int BIT[N_MAX];
void Update(int poz, int val)
{
for (int i = poz; i <= N; i += lsb(i))
BIT[i] = max(BIT[i], val);
}
int Query(int poz)
{
int ret = 0;
for (int i = poz; i > 0; i -= lsb(i))
ret = max(ret, BIT[i]);
return ret;
}
int mx, poz, Q[N_MAX];
vector < int > Ans;
int main()
{
fin >> N;
for (int i = 1; i <= N; i++)
{
fin >> v[i].first;
v[i].second = i;
Val[i] = v[i].first;
}
sort(v + 1, v + N + 1);
for (int i = 1; i <= N; i++)
Poz[v[i].first] = i;
for (int i = 1; i <= N; i++)
a[i] = Poz[Val[i]];
for (int i = 1; i <= N; i++)
{
Q[i] = Query(a[i]) + 1;
Update(a[i], Q[i]);
}
for (int i = 1; i <= N; i++)
mx = max(mx, Q[i]);
fout << mx << "\n";
for (int i = N; i >= 1; i--)
if (Q[i] == mx && (poz == 0 || a[i] < a[poz]))
{
mx--;
poz = i;
Ans.push_back(v[a[i]].first);
}
reverse(Ans.begin(), Ans.end());
for (int val: Ans)
fout << val << " ";
return 0;
}