Pagini recente » Cod sursa (job #2520752) | Cod sursa (job #489500) | Cod sursa (job #1341924) | Cod sursa (job #1165800) | Cod sursa (job #749506)
Cod sursa(job #749506)
#include <stdio.h>
#define MAXN 100004
#define INF 1000000
int n;
int a[MAXN];
int l;
int b[MAXN], c[MAXN];
inline int get_middle(int a, int b)
{
//return a + (b - a +1) / 2;
return (a + b) / 2;
}
inline int between(int x, int a, int b)
{ return x>a && x<b;}
FILE *g;
void print_sol(int x)
{
if(!x)
return;
print_sol(c[x]);
fprintf(g,"%d ",a[x]);
}
int main()
{
FILE *f;
f = fopen("scmax.in", "r");
fscanf(f,"%d",&n);
int i;
for(i=1;i<=n;i++)
{
fscanf(f,"%d",&a[i]);
}
fclose(f);
a[0] = -INF;
b[1] = 1;
c[1] = 0; // predecesor
l = 1;
int lo, hi, mid;
for(i=2;i<=n;i++)
{
//printf("i = %d; l = %d\n",i,l);
if(a[b[l]] < a[i])
{
b[l+1] = i;
c[i] = b[l];
l++;
//printf("poz %d creste lung sirului\n",i);
continue;
}
lo = 1; hi = l;
while(lo <= hi)
{
mid = get_middle(lo, hi);
//printf("%d %d %d\n", lo, mid, hi);
if(a[b[mid]] > a[i])
if(a[i] > a[b[mid-1]])
{
// printf("imbunatatesc sirul de lung %d inlocuind %d cu %d\n", mid, a[b[mid]], a[i]);
c[i] = b[mid-1];
b[mid] = i;
break;
}
else hi = mid - 1;
else lo = mid + 1;
}
}
g = fopen("scmax.out", "w");
fprintf(g,"%d\n",l);
print_sol(b[l]);
fclose(g);
//printf("sol: %d\n",l);
return 0;
}