Pagini recente » Cod sursa (job #831150) | Cod sursa (job #296369) | Cod sursa (job #499315) | Cod sursa (job #464772) | Cod sursa (job #812256)
Cod sursa(job #812256)
#include<stdlib.h>
#include<stdio.h>
FILE *g;
void afisare(int nr, int P[],int n, int V[]) {
int i,temp[nr+1],nr2=nr;
fprintf(g,"%i\n", nr);
for(i=n;nr>0;i--)
if(P[i]==nr)
{
temp[nr]=V[i];
nr--;
}
for(i=1;i<=nr2;i++)
fprintf(g,"%i ", temp[i]);
}
int pozitie(int x, int Q[], int *nr) {
int p,u,m;
p=1; u=*nr+1; m=(u+p)/2;
if(Q[*nr]<x) {
*nr=*nr+1;
return *nr;
}
while(p<=u) {
if(Q[m] < x && Q[m+1] >= x)
return m+1;
else
if(Q[m+1] < x) {
p=m+1;
m=(p+u)/2;
}
else {
u=m-1;
m=(p+u)/2;
}
}
printf("%i ",x);
return 1;
}
void P3(int V[],int n) {
int P[n+1],Q[n+1];
int i,poz,nr;
Q[0]=-1; Q[1]=V[1]; P[1]=1; nr=1; P[0]=0;
for(i=2;i<=n;i++) {
poz=pozitie(V[i],Q,&nr);
Q[poz]=V[i];
P[i]=poz;
Q[nr+1]=2000000001;
}
afisare(nr,P,n,V);
}
int main() {
char *fintrare, *fiesire;
fintrare ="scmax.in";
fiesire ="scmax.out";
int n,V[100001];
FILE *f;
f=fopen(fintrare,"rt");
fscanf(f,"%i",&n);
int i;
for(i=1; i<=n; i++)
fscanf(f,"%i", &V[i]);
fclose(f);
g=fopen(fiesire,"wt");
P3(V,n);
fclose(g);
}