Cod sursa(job #1966253)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 15 aprilie 2017 01:31:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

vector<int> norm,sol;
pair<int,int> aib[100010];
int v[100010],tata[100010],n;

int poz_norm(int x)
{
    return lower_bound(norm.begin(),norm.end(),x)-norm.begin()+1;
}

void aib_update(int i,int s,int poz)
{
    for(;i<=n;i+=i&(-i))
        if(s>aib[i].first) aib[i]={s,poz};
}

pair<int,int> aib_query(int i)
{
    pair<int,int> ret={0,0};
    for(;i>=1;i-=i&(-i))
        ret=max(ret,aib[i]);
    return ret;
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
        norm.push_back(v[i]);
    }
    sort(norm.begin(),norm.end());
    for(int i=1;i<=n;i++)
    {
        int poz=poz_norm(v[i]);
        pair<int,int> a=aib_query(poz-1);
        tata[i]=a.second;
        aib_update(poz,a.first+1,i);
    }
    pair<int,int> ret=aib_query(n);
    for(int i=ret.second;i;i=tata[i]) sol.push_back(v[i]);
    printf("%d\n",sol.size());
    for(int i=sol.size()-1;i>=0;i--)
        printf("%d ",sol[i]);
    return 0;
}