Cod sursa(job #827572)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 2 decembrie 2012 12:11:44
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <algorithm>
#define zeros(x) (x&-x)
using namespace std;

ofstream g("scmax.out");
int aib[100005],x[100005],n,s[100005],prec[100005],sol[100005];


void citire()
{
    ifstream f("scmax.in");
    f>>n;
    for(int i=1;i<=n;i++)
    {
        f>>x[i];
        s[i]=x[i];
    }
}
void update(int i,int x)
{
    for(;i<=n;i+=zeros(i))
        if(sol[aib[i]]<sol[x])
            aib[i]=x;
}

int query(int i)
{
    int maxx=0;
    for(;i;i-=zeros(i))
        if(sol[aib[i]]>sol[maxx])
            maxx=aib[i];
    return maxx;
}

void afis(int i)
{
    if(!i)
        return;
    afis(prec[i]);
    g<<s[x[i]]<<' ';
}
int main()
{
    citire();
    int maxim=0,maxx=0;
    sort(s+1,s+n+1);
    int h=1;
    for(int i=2;i<=n;i++)
        if(s[h]!=s[i])
            s[++h]=s[i];
    for(int i=1;i<=n;i++)
        x[i]=lower_bound(s+1,s+h+1,x[i])-s;
    for(int i=1;i<=n;i++)
    {
        prec[i]=query(x[i]-1);
        sol[i]=sol[prec[i]]+1;
        if(sol[i]>maxim)
        {
            maxim=sol[i];
            maxx=i;
        }
        update(x[i],i);
    }
    g<<maxim<<'\n';
    afis(maxx);
    return 0;
}