Cod sursa(job #1267434)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 19 noiembrie 2014 21:25:18
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <algorithm>
#define ub(x) x&(-x)
#define nmax 100005
using namespace std;
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
int n,v[nmax],a[nmax],x[nmax];
int aib[nmax],aib2[nmax],maxim[nmax];
int poz,caut,ma,sol[nmax];


void cautbin(int p,int q)
{if (p>q) return;
int mijl=(p+q)>>1;
if (caut<=a[mijl])
        {poz=mijl;
         cautbin(p,mijl-1);}
    else cautbin(mijl+1,q);

}
void normalizare()
{int i;
sort(a+1,a+n+1);
for (i=1;i<=n;i++)
        {poz=0;
         caut=v[i];
         cautbin(1,n);
         x[i]=poz+1;
         }
}
void update(int x,int val)
{int i;
for (i=x;i<nmax;i+=ub(i)) if (val>aib[i])
                {aib[i]=val;
                 aib2[i]=poz;}
}
int maxulet(int x)
{int m=1,i;
for (i=x;i>=1;i-=ub(i)) if (aib[i]+1>m)
                    {m=aib[i]+1;
                     poz=aib2[i];}
return m;
}


int main()
{int i,j;
fscanf(f,"%d",&n);
for (i=1;i<=n;i++) {fscanf(f,"%d",&v[i]);
                    a[i]=v[i];}
normalizare();
for (i=1;i<=n;i++)
        {poz=0;
         maxim[i]=maxulet(x[i]-1);
         a[i]=poz;
         poz=i;
         update(x[i],maxim[i]);}
for (i=1;i<=n;i++) if (maxim[i]>ma) {ma=maxim[i];
                                     poz=i;}
fprintf(g,"%d\n",ma);
j=0;
while (poz!=0)
        {sol[++j]=v[poz];
         poz=a[poz];
         }
for (i=j;i>=1;i--) fprintf(g,"%d ",sol[i]);
return 0;
}