Cod sursa(job #1737711)

Utilizator refugiatBoni Daniel Stefan refugiat Data 4 august 2016 17:11:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define mkp make_pair
#define a first
#define b second
#define NMAX 100005
#define per pair<int,int>
using namespace std;
ifstream si("scmax.in");
ofstream so("scmax.out");
per aib[NMAX],v[NMAX];
int p[NMAX],r[NMAX],sol[NMAX];
int n;
void update(int poz,int x,int xpoz)
{
    for(;poz<=n;poz+=poz&(-poz))
    {
        if(aib[poz].a<x)
        {
            aib[poz].a=x;
            aib[poz].b=xpoz;
        }
    }
}
per querry(int poz)
{
    int m,mpoz;
    for(m=0;poz;poz-=poz&(-poz))
    {
        if(aib[poz].a>m)
        {
            m=aib[poz].a;
            mpoz=aib[poz].b;
        }
    }
    return mkp(m,mpoz);
}
int main()
{
    si>>n;
    int i;
    for(i=1;i<=n;++i)
    {
        si>>v[i].a;
        v[i].b=-i;
        r[i]=v[i].a;
    }
    sort(v+1,v+1+n);
    per q;
    int m=0,mpoz;
    for(i=1;i<=n;++i)
    {
        q=querry(-v[i].b);
        if(q.a+1>m)
        {
            m=q.a+1;
            mpoz=-v[i].b;
        }
        p[-v[i].b]=q.b;
        update(-v[i].b,q.a+1,-v[i].b);
    }
    so<<m<<'\n';
    n=m;
    for(m=0;n--;mpoz=p[mpoz],m++)
    {
        sol[m]=r[mpoz];
    }
    while(m--)
        so<<sol[m]<<' ';
    so.close();
    return 0;
}