Cod sursa(job #1690128)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 14 aprilie 2016 20:01:11
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define INF numeric_limits<int>::max()
#define int64 long long
#define lsb(x) (-x)&(x)
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
set<int> S;
int nrm[100010],n,a[100010],m,bit[100010],dp[100010];
bool use[100010];
int bin_search(int x)
{
    int left=1,right=m;
    while(left<=right)
    {
        int mid=(left+right)/2;
        if(nrm[mid]==x)
            return mid;
        if(nrm[mid]>x)
            right=mid-1;
        else
            left=mid+1;
    }
    return (left+right)/2;
}
void update(int pos)
{
    for(int i=pos;i<=n;i+=lsb(i))
        bit[i]++;
}
int sum(int pos)
{
    int s=0;
    for(int i=pos;i>0;i-=lsb(i))
        s+=bit[i];
    return s;
}
void afis(int pos,int k)
{

    while(dp[pos]!=k && pos>0)
        pos--;
    if(k-1!=0)
    afis(pos-1,k-1);
    out<<a[pos]<<' ';
}
int main()
{
    in>>n;
    for(int i=1;i<=n;i++)
    {
        in>>a[i];
        S.insert(a[i]);
    }
    for(auto it: S)
        nrm[++m]=it;
    int sol=0,pos=0;
    for(int i=1;i<=n;i++)
    {
        int x=bin_search(a[i]);
        if(use[x]==false)
        {
            update(x);
            use[x]=true;
        }
        dp[i]=sum(x);
        if(dp[i]>sol)
        {
            sol=dp[i];
            pos=i;
        }
    }
    out<<sol<<'\n';
    afis(pos,sol);
    return 0;
}