Pagini recente » Cod sursa (job #2588682) | Cod sursa (job #1848775) | Cod sursa (job #1362402) | Cod sursa (job #1523465) | Cod sursa (job #2770320)
#include<fstream>
#include <set>
#include<vector>
#include<algorithm>
#include <unordered_map>
#define NMAX 100010
#define lsb(x) (x&(-x))
using namespace std;
int a[NMAX];
int a2[NMAX];
int a3[NMAX];
int dp[NMAX];
int aib[NMAX];
int n;
ifstream f("scmax.in");
ofstream g("scmax.out");
void compressCoord()
{
set<int> s;
for (int i = 1; i <= n; i++)
s.insert(a[i]);
unordered_map<int, int> hmap;
int idx = 0;
for (auto it : s)
{
idx++;
hmap[it]=idx;
}
for (int i = 1; i <= n; i++)
a2[i] = hmap[a[i]];
}
int query(int index)
{
int ans = 0;
for (int i = index; i > 0; i -= lsb(i))
ans = max(aib[i], ans);
return dp[index]=ans;
}
int update(int index)
{
int x = (dp[index-1]?dp[index-1] : query(index-1));
for (int i = index; i <= n; i += lsb(i))
{
aib[i] = max(aib[i], x + 1);
dp[i] = max(aib[i], dp[i]);
}
return x + 1;
}
int main()
{
ios_base::sync_with_stdio(false);
f.tie(0);
g.tie(0);
f >> n;
for (int i = 1; i <= n; i++)
f >> a[i];
compressCoord();
for (int i = 1; i <= n; i++)
{
a3[i]=update(a2[i]);
}
int hmax = query(n);
vector<int> sol;
for(int i=n;i>=1;i--)
if (a3[i] == hmax)
{
hmax--;
sol.push_back(i);
}
reverse(begin(sol), end(sol));
g << sol.size() << '\n';
for (auto it : sol)
g << a[it] << " ";
}