Pagini recente » Cod sursa (job #1763657) | Arhiva de probleme | Cod sursa (job #1884774) | Cod sursa (job #1686587) | Cod sursa (job #1268660)
// FMI - Grupa 135 - Semigrupa 2 - Hareza Andrei
// Include
#include <fstream>
using namespace std;
// Constante
const int sz = 100001;
// Functii
template<class T> int binarySearch(T *data, int left, int right, T value, bool (*comp)(T a, T b));
void route(int node);
bool cmp(int a, int b);
// Variabile
ifstream in("scmax.in");
ofstream out("scmax.out");
int num;
int values[sz];
int best[sz];
int father[sz];
// Main
int main()
{
in >> num;
int right = 0;
for(int i=1 ; i<=num ; ++i)
{
in >> values[i];
int lenMax = binarySearch(best, 0, right, i, cmp);
if(best[lenMax] && values[best[lenMax]] <= values[i])
continue;
best[lenMax] = i;
father[i] = best[lenMax-1];
right = max(right, lenMax);
}
out << right << '\n';
route(best[right]);
out << '\n';
in.close();
out.close();
return 0;
}
template<class T> int binarySearch(T *data, int left, int right, T value, bool (*comp)(T a, T b))
{
if(comp(value, data[left]))
return left;
if(!comp(value, data[right]))
return right+1;
int dif = right - left + 1;
data += left;
right -= left;
int pos = 0;
int power = 0;
while(1<<++power <= dif);
while(power--)
{
if(right <= pos + (1<<power))
{
if(power < 0)
break;
continue;
}
if(!comp(value, data[pos+(1<<power)]))
pos += 1<<power;
}
return pos+left+1;
}
void route(int node)
{
if(father[node])
route(father[node]);
out << values[node] << ' ';
}
bool cmp(int a, int b)
{
return values[a] <= values[b];
}