Pagini recente » Cod sursa (job #2088090) | Cod sursa (job #310640) | Cod sursa (job #3263390) | Cod sursa (job #1699216) | Cod sursa (job #798259)
Cod sursa(job #798259)
#include<stdio.h>
long n,v[100003],max=1,lung[100003],p[100003],coresp[100003];
FILE*f=fopen("scmax.in","r"),*g=fopen("scmax.out","w");
void citire(){
fscanf(f,"%ld ",&n);
for(long i=1;i<=n;i++){
fscanf(f,"%ld ",&v[i]);
}
fclose(f);
}
long cautare(long x){
long in=1,sf=max,m;
while(in<=sf){
m=(in+sf)/2;
if(v[p[m]]<x){
in=m+1;
}
else sf=m-1;
}
return in;
}
void determinare_subsir(){
p[1]=1;
lung[1]=1;
long poz=0;
for(long i=2;i<=n;i++){
poz=cautare(v[i]);
p[poz]=i;
lung[i]=poz;
coresp[i]=p[poz-1];
if(poz>max){max=poz;}
}
}
void corespondenta(long x){
if(coresp[x]!=0)corespondenta(coresp[x]);
fprintf(g,"%ld ",v[x]);
}
void afisare(){
fprintf(g,"%ld\n",max);
for(long i=1;i<=n;i++){
if(lung[i]==max){
corespondenta(i);
break;
}
}
fclose(g);
}
int main(){
citire();
determinare_subsir();
afisare();
return 0;
}