Pagini recente » Monitorul de evaluare | Cod sursa (job #1450253) | Cod sursa (job #3326623) | Cod sursa (job #412330) | Cod sursa (job #3326719)
#include <bits/stdc++.h>
using namespace std;
#define int long long
// Tema: sol fara aib
int aib[100005];
int aib_poz[100005];
void update(int poz, int val, int in_sir)
{
while(poz<100005)
{
if(val>aib[poz])
{
aib[poz]=val;
aib_poz[poz]=in_sir;
}
poz+=(poz&-poz);
}
}
int max1, in_sir;
void query(int poz)
{
while(poz>0)
{
if(aib[poz]>max1)
{
max1=aib[poz];
in_sir=aib_poz[poz];
}
poz-=(poz&-poz);
}
}
int dp[100005];
int pred[100005];
int af[100005];
int v[100005];
int32_t main()
{
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
int n;
cin >> n;
for(int i=1; i<=n; i++)
cin >> v[i];
dp[v[1]]=1;
update(v[1], 1, 1);
int ras=0, poz;
for(int i=2; i<=n; i++)
{
if(v[i]==1)
{
dp[v[i]]=1;
update(v[i], dp[v[i]], i);
}
else
{
max1=0;
query(v[i]-1);
dp[v[i]]=max1+1;
pred[i]=in_sir;
update(v[i], dp[v[i]], i);
}
if(dp[v[i]]>ras)
{
ras=dp[v[i]];
poz=i;
}
}
cout << ras << '\n';
int cnt=0;
while(poz!=0)
{
af[++cnt]=v[poz];
poz=pred[poz];
}
for(int i=cnt; i>=1; i--)
cout << af[i] << ' ';
return 0;
}