Cod sursa(job #862419)

Utilizator dariusdariusMarian Darius dariusdarius Data 22 ianuarie 2013 18:10:08
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> q,p,sol;
int a[100005];
void add(int x)
{
    int st,dr,med,last;
    if(q.empty() || q[q.size()-1]<x)
    {
        q.push_back(x);
        p.push_back(q.size()-1);
    }
    else
    {
        st=0;dr=q.size()-1;last=q.size()-1;
        while(st<=dr)
        {
            med=(st+dr)/2;
            if(q[med]>x)
            {
                last=med;
                dr=med-1;
            }
            else
                st=med+1;
        }
        q[last]=x;p.push_back(last);
    }
}
int main()
{
    freopen("lis.in","r",stdin);
    freopen("lis.out","w",stdout);
    int n=0,i;
	scanf("%d",&n);
    for(i=1;i<=n;i++)
	{
        scanf("%d",&a[i]);
        add(a[i]);
	}
    printf("%d\n",(int)q.size());
    int search=(int)q.size()-1;
    for(i=(int)p.size()-1;i>=0;i--)
    {
        if(p[i]==search)
        {
            sol.push_back(a[i+1]);
            search--;
            if(search==-1) break;
        }
    }
    reverse(sol.begin(),sol.end());
    for(vector<int>::iterator it=sol.begin();it!=sol.end();it++)
        printf("%d ",*it);
    return 0;
}