Cod sursa(job #2027155)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 25 septembrie 2017 18:24:42
Problema Subsir 2 Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#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;
}