Cod sursa(job #1163206)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 1 aprilie 2014 11:22:12
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

int lsb(int nr)
{
    return ((nr)&(-nr));
}

int aib[100005],vl[100005];

void update(int where,int val)
{
    int i;
    for (i=where;i<100003;i+=lsb(i))
        if (vl[val]>vl[aib[i]])
            aib[i]=val;
}

int query(int where)
{
    int i,imx;
    imx=0;
    for (i=where;i>0;i-=lsb(i))
        if (vl[aib[i]]>vl[imx])
            imx=aib[i];
    return imx;
}

int i,n,nr,last,imx,l,imxl,bk[100005],ilast;
vector <pair<int,int> > v;
vector <int> rv,r;
int main(void)
{
    FILE * f;
    f=fopen("scmax.in","r");
    ofstream g("scmax.out");
    fscanf(f,"%d",&n);
    for (i=0;i<n;i++)
    {
        fscanf(f,"%d",&nr);
        v.push_back(make_pair(nr,i));
        rv.push_back(nr);
    }
    sort(v.begin(),v.end());
    nr=1;
    last=v[0].first;
    v[0].first=v[0].second;
    v[0].second=nr;
    for (i=1;i<v.size();i++)
    {
        if (v[i].first!=last)
            nr++;
        last=v[i].first;
        v[i].first=v[i].second;
        v[i].second=nr;
    }
    sort(v.begin(),v.end());

    for (i=0;i<v.size();i++)
    {
        nr=v[i].second;
        imx=query(nr-1);
        vl[i]=vl[imx]+1;
        bk[i]=imx;
        if (vl[i]>vl[imxl])
            imxl=i;
        update(nr,i);
    }
    i=imxl;

    while (i!=0)
    {
        r.push_back(rv[i]);
        ilast=i;
        i=bk[i];
    }

    if (rv[i]<rv[ilast])
        r.push_back(rv[i]);

    g<<r.size()<<'\n';
    for (i=r.size()-1;i>=0;i--)
        g<<r[i]<<' ';
    g<<'\n';
    g.close();
    return 0;
}