Cod sursa(job #873249)

Utilizator tibi9876Marin Tiberiu tibi9876 Data 6 februarie 2013 23:32:31
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
#include<algorithm>
using namespace std;
 
struct st
{
    int x,y;
};
 
st a[100001],c[100001];
int b[100001],aib[100001],i,n,x,y;
 
ifstream f("scmax.in");
ofstream g("scmax.out");
 
void update(int k,int x)
{
    int i;
    for (i=k;i<=n;i=(i | (i-1))+1)
        aib[i]=max(aib[i],x);
}
 
int query(int k)
{
    int i,s=0;
    for (i=k;i>0;i=i & (i-1))
        s=max(s,aib[i]);
    return s;
}
 
void afis()
{
    int p;
    while (i>1)
    {
        i--;
        if ((b[i]==x) && (c[i].x<y))
        {
            p=c[i].x;
            x--;
            y=c[i].x;
            afis();
            g << p << ' ';
        }
    }
}
 
bool cmp(st a,st b)
{
    return a.x<b.x;
}
 
int main()
{
    f >> n;
    for (i=1;i<=n;i++)
    {
        f >> a[i].x;
        a[i].y=i;
    }
    sort(a+1,a+n+1,cmp);
    x=0;
    for (i=1;i<=n;i++)
    {
        if (a[i].x!=a[i-1].x)
            x++;
        c[a[i].y].y=x;
        c[a[i].y].x=a[i].x;
    }   
    x=0;
	for (i=1;i<=n;i++)
    {
        b[i]=query(c[i].y-1)+1;
        update(c[i].y,b[i]);
		if (b[i]>x)
        {
            x=b[i];
            y=c[i].x;
        }
    }
    y++;
    i=n+1;
    g << x << "\n";
    afis();
    return 0;
}