Cod sursa(job #2263833)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 19 octombrie 2018 13:29:00
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
#define val first
#define pos second
using namespace std;
bool comp(pair <int,int> a,pair <int,int> b)
{
    if(a.val==b.val)
        return a.pos>b.pos;
    return a.val<b.val;
}
pair <int,int> v[100001],rez[100001],aib[100001];
int n,fcsb[100001];
vector <int> sir;

int zeros(int x)
{
    return (x^(x-1))&x;
}

void update(int i,int x)
{
    for(int ct=i; ct<=n; ct+=zeros(ct))
        if(x>aib[ct].val)
            aib[ct]={x,i};
}

pair <int,int> query(int i)
{
    pair <int,int> z={0,0};
    for(int ct=i; ct>0; ct-=zeros(ct))
        if(aib[ct].val>z.val)
            z={aib[ct].val,aib[ct].pos};
    return z;
}

int main()
{
    int i,lgmax,p;
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&v[i].val);
        v[i].pos=i;
        fcsb[i]=v[i].val;
    }
    sort(v+1,v+1+n,comp);
    lgmax=0;
    p=0;
    for(i=1; i<=n; i++)
    {
        pair <int,int> z;
        z=query(v[i].pos);
        rez[v[i].pos]={z.val+1,z.pos};
        update(v[i].pos,rez[v[i].pos].val);
        if(rez[v[i].pos].val>lgmax)
        {
            lgmax=rez[v[i].pos].val;
            p=v[i].pos;
        }
    }
    while(p>0)
    {
        sir.push_back(fcsb[p]);
        p=rez[p].pos;
    }
    printf("%d\n",lgmax);
    while(!sir.empty())
    {
        printf("%d ",sir.back());
        sir.pop_back();
    }

    return 0;
}