Pagini recente » Borderou de evaluare (job #2619297) | Cod sursa (job #1358149) | Cod sursa (job #3320158) | Cod sursa (job #1534556) | Cod sursa (job #3320647)
#include <fstream>
#include <vector>
#include <unordered_map>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
unordered_map<int, int> norm;
const int VMAX = 2e9;
const int NMAX = 1e5 + 1;
int aib[NMAX], n;
void update(int x, int y)
{
for (int i = x; i <= n; i += i & (-i))
aib[i] = max(aib[i], y);
}
int query(int x)
{
int maxi = 0;
for (int i = x; i; i -= i & (-i))
maxi = max(maxi, aib[i]);
return maxi;
}
int v[NMAX], c[NMAX], ans[NMAX];
int main()
{
fin >> n;
int maxi = 0;
for (int i = 1; i <= n; ++i)
{
fin >> v[i];
c[i] = v[i];
}
sort(c + 1, c + n + 1);
int i = 1, poz = 1;
for (int i = 1; i <= n; ++i)
{
while (i < n && c[i] == c[i + 1])
++i;
norm[c[i]] = poz++;
}
for (int i = 1; i <= n; ++i)
{
c[i] = norm[v[i]];
ans[i] = query(c[i] - 1) + 1;
maxi = max(maxi, ans[i]);
update(c[i], ans[i]);
}
fout << maxi << '\n';
stack<int> lis;
for (int i = n; i; --i)
{
if (ans[i] == maxi)
{
--maxi;
lis.push(v[i]);
}
}
while (!lis.empty())
{
fout << lis.top() << " ";
lis.pop();
}
return 0;
}