Pagini recente » Cod sursa (job #3005616) | Cod sursa (job #2552470) | Cod sursa (job #1788571) | Cod sursa (job #473665) | Cod sursa (job #49799)
Cod sursa(job #49799)
#include <stdio.h>
int n, v[5001], a[5001], prev[5001], solv[5001];
void print(int pos);
int f(int start, int end);
int main()
{
freopen("subsir2.in","r",stdin);
freopen("subsir2.out","w",stdout);
int i, min, max, temp, x, sol;
scanf("%d", &n);
for(i = 1; i <= n; ++i)
{
scanf("%d", &v[i]);
}
min = 1;
max = 1;
for(i = 2; i <= n; ++i)
{
if(v[i] < v[min])
min = i;
if(v[i] > v[max])
max = i;
}
a[0] = 0;
v[0] = -1000001;
sol = f(min, n);
x = sol;
temp = a[x];
do
{
solv[x] = temp;
--x;
temp = prev[temp];
}
while(temp);
temp = f(1, max);
if(temp < sol)
{
sol = temp;
x = sol;
temp = a[x];
do
{
solv[x] = temp;
--x;
temp = prev[temp];
}
while(temp);
}
printf("%d\n", sol);
for(i = 1; i <= sol; ++i)
{
printf("%d ", solv[i]);
}
return 0;
}
void print(int pos)
{
if(pos)
{
print(prev[pos]);
printf("%d ", pos);
}
}
int f(int start, int end)
{
int i, min, mid, max, cnt = 1, sol;
a[1] = start;
for(i = start + 1; i <= end; ++i)
{
min = 0;
max = cnt;
sol = cnt;
while(min <= max)
{
mid = (min + max) >> 1;
if(v[a[mid]] <= v[i])
{
min = mid + 1;
sol = mid;
}
else
{
max = mid - 1;
}
}
a[sol + 1] = i;
prev[i] = a[sol];
if(sol + 1 > cnt)
cnt = sol + 1;
/*
for(j = 1; j <= cnt; ++j)
{
printf("%d ", v[a[j]]);
}
printf("\n");
*/
}
return cnt;
}