Pagini recente » Profil eudanip | Cod sursa (job #2330486) | Cod sursa (job #838817) | Cod sursa (job #1083050) | Cod sursa (job #2027155)
#include<bits/stdc++.h>
#define maxN 5005
#define lsb(i) (i&(-i))
using namespace std;
pair<int,int> p[maxN];
int AIB[maxN],best[maxN],pre[maxN],maxim,v[maxN],n,dp[maxN],cnt;
bool seen[maxN];
int bestind;
inline void Update(int pos,int val,int ind)
{
for(int i=pos;i<=cnt;i+=lsb(i))
{
if(val>AIB[i])
{
AIB[i]=val;
best[i]=ind;
}
}
}
inline pair<int,int> Query(int pos)
{
int q=0,bst=0;
for(int i=pos;i>=1;i-=lsb(i))
{
if(AIB[i]>q)
{
q=AIB[i];
bst=best[i];
}
}
return make_pair(q,bst);
}
deque<int> q;
int main()
{
freopen("subsir2.in","r",stdin);
freopen("subsir2.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
p[i]={v[i],i};
}
sort(p+1,p+n+1);
cnt=1;
for(int i=1;i<=n;i++)
{
if(i>1 && p[i].first>p[i-1].first) cnt++;
v[p[i].second]=cnt;
}
for(int i=1;i<=n;i++)
{
dp[i]=1;
pair<int,int> q=Query(v[i]);
pre[i]=0;
if(q.first)
{
dp[i]=q.first+1;
pre[i]=q.second;
seen[pre[i]]=1;
}
Update(v[i],dp[i],i);
}
for(int i=1;i<=n;i++)
{
if(!seen[i]) //nu mai extinde
{
if(dp[i]>maxim)
{
maxim=dp[i];
bestind=i;
}
}
}
printf("%d\n",maxim);
int ind=bestind;
while(ind)
{
q.push_back(v[ind]);
ind=pre[ind];
}
while(!q.empty())
{
printf("%d ",q.back());
q.pop_back();
}
return 0;
}