Pagini recente » Cod sursa (job #652576) | Cod sursa (job #799093) | Cod sursa (job #1211239) | Cod sursa (job #1685447) | Cod sursa (job #2391898)
#include <bits/stdc++.h>
#define N_MAX 100002
using namespace std;
int n;
struct elm
{
int val, index;
};
bool operator < (elm a, elm b)
{
return a.val < b.val;
}
elm e[N_MAX];
elm v[N_MAX];
int dp[N_MAX], pre[N_MAX];
pair <int, int> aib[N_MAX];
void upd (int pos, int val, int dpval)
{
for(int i = val; i <= n; i += i&(-i))
aib[i] = max(aib[i], make_pair(dpval, pos));
}
pair <int, int> qry (int val)
{
pair <int, int> ans = make_pair(0, 0);
for(int i = val; i >= 1; i -= i&(-i))
ans = max(ans, aib[i]);
return ans;
}
int ans[N_MAX];
int main()
{
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
fin >> n;
for(int i = 1; i <= n; i++)
{
fin >> e[i].val;
e[i].index = i;
}
sort(e + 1, e + n + 1);
int val = 0;
for(int i = 1; i <= n; i++)
{
if(e[i].val > e[i - 1].val)
val++;
v[e[i].index] = elm{e[i].val, val};
}
int best = 0;
for(int i = 1; i <= n; i++)
{
pair <int, int> p = qry(v[i].index - 1);
dp[i] = p.first + 1;
pre[i] = p.second;
if(dp[i] > dp[best])
best = i;
upd(i, v[i].index, dp[i]);
}
fout << dp[best] << "\n";
while(best > 0)
{
ans[++ans[0]] = best;
best = pre[best];
}
for(int i = ans[0]; i >= 1; i--)
fout << v[ans[i]].val << " ";
fout << "\n";
return 0;
}