Cod sursa(job #1737554)

Utilizator refugiatBoni Daniel Stefan refugiat Data 4 august 2016 13:35:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 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 rez=0,rpoz;
    for(;poz;poz-=poz&(-poz))
    {
        if(rez<aib[poz].a)
        {
            rez=aib[poz].a;
            rpoz=aib[poz].b;
        }
    }
    return mkp(rez,rpoz);
}
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;n--,mpoz=p[mpoz])
    {
        sol[m]=r[mpoz];
        ++m;
    }
    while(m--)
    {
        so<<sol[m]<<' ';
    }
    so.close();
    return 0;
}