Pagini recente » Cod sursa (job #1195268) | Cod sursa (job #614924) | Cod sursa (job #1695635) | Cod sursa (job #1510594) | Cod sursa (job #2724909)
#include <bits/stdc++.h>
#define lsb(i) ((i ^ (i - 1)) & i)
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int N_MAX = 1e5 + 5;
int N, x;
vector < pair < int, int > > v;
int nor[N_MAX], cnt = 1;
int BIT[N_MAX], Q[N_MAX];
unordered_map < int, int > MP;
void Update(int pos, int val)
{
for (int i = pos; i <= N; i += lsb(i))
BIT[i] = max(BIT[i], val);
}
int Query(int pos)
{
int ret = 0;
for (int i = pos; i > 0; i -= lsb(i))
ret = max(ret, BIT[i]);
return ret;
}
int main()
{
fin >> N;
for (int i = 1; i <= N; i++)
{
fin >> x;
v.push_back(make_pair(x, i));
}
sort(v.begin(), v.end());
for (int i = 0; i < N; i++)
{
int pos = v[i].second;
int val = v[i].first;
if (i > 0 && v[i - 1].first != val)
cnt++;
nor[pos] = cnt;
MP[cnt] = val;
}
for (int i = 1; i <= N; i++)
{
Q[i] = Query(nor[i] - 1) + 1;
Update(nor[i], Q[i]);
}
int mx = 0;
vector < int > Ans;
for (int i = 1; i <= N; i++)
mx = max(mx, Q[i]);
for (int i = N; i >= 1; i--)
if (Q[i] == mx)
{
Ans.push_back(MP[nor[i]]);
mx--;
}
reverse(Ans.begin(), Ans.end());
fout << Ans.size() << "\n";
for (int i = 0; i < Ans.size(); i++)
fout << Ans[i] << " ";
return 0;
}