#include <stdio.h>
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <deque>
using namespace std;
// вспомогательные типы
typedef vector< double > tValues;
typedef map< double, bool > tSortedValues;
typedef vector< tValues > tSequences;
// возвращает true, если первый вектор (wheer) содержит второй (what)
bool containValues( tValues& where, tValues& what )
{
if ( what.size() > 0 )
{
for( int i = 0; i < where.size(); i++ )
{
if ( where[ i ] == what[ 0 ] )
{
int k = i + 1;
int j = 1;
for(; j < what.size() && k < where.size() && where[ k ] == what[ j ]; j++, k++ );
return ( j == what.size() );
}
}
}
return false;
}
// вспомогательная функция печати последовательности
void printSequence( tValues& seq )
{
if ( seq.size() > 1 )
{
double diff = seq[ 1 ] - seq[ 0 ];
cout << "sequence: size=" << seq.size() << ", diff=" << diff << ", values = { ";
for( int i = 0; i < seq.size(); i++ )
{
cout << seq[ i ] << " ";
}
cout << "}\n";
}
else
{
cout << "NOT a sequence" << endl;
}
}
int main(void)
{
int n;
cin >> n;
if ( n <= 0 )
{
cout << "Input error: wrong length of the sequence" << endl;
return 0;
}
tValues sourceValues; // вектор для входных значений, в которых мы будем искать последовательность
for( int i = 0; i < n; i++ ) // ввод входных значений
{
double val;
cin >> val;
sourceValues.push_back( val );
}
// нахождение всех возможные разностей между входными значениями
tValues diffValues;// вектор для хранения всех возможные разностей между входными значениями
for( int i = 0; i < sourceValues.size(); i++ )
{
tSortedValues sortedValues;
for( int j = 0; j < sourceValues.size(); j++ )
{
if ( j != i )
{
double diff =
( i < j ) ?
sourceValues[ j ] - sourceValues[ i ] :
sourceValues[ i ] - sourceValues[ j ] ;
if ( diff > 0 )
{
sortedValues[ diff ] = true;
}
}
}
for( tSortedValues::iterator it = sortedValues.begin(); it != sortedValues.end(); ++it )
{
diffValues.push_back( it->first );
}
}
// главный цикл по входным значениям
tSequences foundSequences;// вектор векторов, в котором будем помещать все найденные последовательности
for( int srcValIdx = 0; srcValIdx < sourceValues.size(); srcValIdx++ )
{
double seedVal = sourceValues[ srcValIdx ]; // начальное значение для старта поиска последовательности
// цикл по вектору разности
for( int diffValIdx = 0; diffValIdx < diffValues.size(); diffValIdx++ )
{
double diffVal = diffValues[ diffValIdx ];
double lastVal;
tValues candidateSeq;
candidateSeq.push_back( seedVal );
// поиск последовательности влево от исходного значения
lastVal = seedVal;
for( int j = srcValIdx - 1; j >= 0; j-- )
{
double prevVal = sourceValues[ j ];
if ( prevVal == lastVal - diffVal )
{
candidateSeq.insert( candidateSeq.begin(), prevVal );
lastVal = prevVal;
}
}
// поиск последовательности вправо от исходного значения
lastVal = seedVal;
for( int j = srcValIdx + 1; j < sourceValues.size(); j++ )
{
double nextVal = sourceValues[ j ];
if ( nextVal == lastVal + diffVal )
{
candidateSeq.push_back( nextVal );
lastVal = nextVal;
}
}
if ( candidateSeq.size() > 2 ) // нейденную последовательность-кандидат помещаем в вектор найденных, если длинна больше двух
{
foundSequences.push_back( candidateSeq );
}
}
}
// удаляем последовательности, которые включают в себя другие
// Удалённые последовательности заменяются на пустышки
for( int i = 0; i < foundSequences.size(); i++ )
{
if ( ! foundSequences[ i ].empty() )
{
for( int j = 0; j < foundSequences.size(); j++ )
{
if ( i != j
&& foundSequences[ i ].size() >= foundSequences[ j ].size()
&& containValues( foundSequences[ i ], foundSequences[ j ] ) )
{
foundSequences[ j ].clear();
}
}
}
}
// удаляем из вектора пустышки из прошлого шага
{
tSequences tmp;
for( int i = 0; i < foundSequences.size(); i++ )
{
if ( ! foundSequences[ i ].empty() )
{
tmp.push_back( foundSequences[ i ] );
}
}
foundSequences = tmp;
}
// ищем максимальную последовательность среди найденных
int maxSize = -1;
int maxIndex = -1;
for( int i = 0; i < foundSequences.size(); i++ )
{
int size = foundSequences[ i ].size();
if ( size > maxSize )
{
maxSize = size;
maxIndex = i;
}
// printSequence( foundSequences[ i ] ); // debug
}
if ( maxIndex >= 0 )
{
cout << "max size sequence:\n";
printSequence( foundSequences[ maxIndex ] );
}
return 0;
}