Pagini recente » Monitorul de evaluare | Cod sursa (job #3305957) | Cod sursa (job #1166689) | Cod sursa (job #3327548) | Cod sursa (job #3326724)
#include <bits/stdc++.h>
using namespace std;
// 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];
map<int, int>M;
int f[100005];
int aux[100005];
int main()
{
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
int n;
cin >> n;
for(int i=1; i<=n; i++)
cin >> v[i], aux[i]=v[i];
sort(aux+1, aux+n+1);
for(int i=1; i<=n; i++)
{
if(M[aux[i]]==0)
{
M[aux[i]]=i;
f[i]=aux[i];
}
}
for(int i=1; i<=n; i++)
v[i]=M[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=in_sir=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 << f[af[i]] << ' ';
return 0;
}