Pagini recente » Cod sursa (job #1093316) | Cod sursa (job #1455552) | Cod sursa (job #709451) | Cod sursa (job #2779742) | Cod sursa (job #2286264)
#include <bits/stdc++.h>
int v[10001];
int predst[10001], pozminst[10001], lst[10001];
int preddr[10001], pozmindr[10001], ldr[10001];
int cautBinSt( int n, int nr ) {
int r = 1, pas = 1 << 13;
while ( pas != 0 ) {
if ( r + pas <= n && v[pozminst[r + pas]] < nr )
r += pas;
pas /= 2;
}
return r;
}
int cautBindr( int n, int nr ) {
int r = 1, pas = 1 << 13;
while ( pas != 0 ) {
if ( r + pas <= n && v[pozmindr[r + pas]] < nr )
r += pas;
pas /= 2;
}
return r;
}
int main() {
FILE *fin, *fout;
int n, i, j, m1, m2, max;
double nr;
fin = fopen( "euro2.in", "r" );
fout = fopen( "euro2.out", "w" );
fscanf( fin, "%d", &n );
m1 = 1;
for ( i = 1; i <= n; i++ ) {
fscanf( fin, "%lf", &nr );
nr *= 10000.0;
v[i] = nr;
j = cautBinSt( m1, v[i] );
predst[i] = pozminst[j];
lst[i] = lst[predst[i]] + 1;
pozminst[j + 1] = i;
if ( j == m1 )
m1++;
}
m2 = 1;
for ( i = n; i >= 1; i-- ) {
j = cautBindr( m2, v[i] );
preddr[i] = pozmindr[j];
ldr[i] = ldr[preddr[i]] + 1;
pozmindr[j + 1] = i;
if ( j == m2 )
m2++;
}
max = 0;
for ( i = 1; i <= n; i++ )
if ( lst[i] + ldr[i] > max && lst[i] > 1 && ldr[i] > 1 )
max = lst[i] + ldr[i];
fprintf( fout, "%d", max - 1 );
fclose( fin );
fclose( fout );
return 0;
}