Pagini recente » Cod sursa (job #1918262) | Cod sursa (job #1698691) | Cod sursa (job #1357612) | Cod sursa (job #38499) | Cod sursa (job #1276357)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
#include <queue>
#define Nmax 100001
#define INF 0x3f3f3f3f
using namespace std;
int solve(int v[], int pos, int max_length, vector< pair<int, int> > &min_val)
{
int left = 1, right = max_length, mid, value = v[pos], sol_pos = pos;
while(left <= right)
{
mid = (left + right)/2;
if(min_val[mid].first < value)
{
sol_pos = min_val[mid].second;
left = mid+1;
} else {
right = mid - 1;
}
}
return sol_pos;
}
int main()
{
int N, v[Nmax], best[Nmax], T[Nmax];
vector< pair<int, int> > min_val;
ifstream f("scmax.in");
f>>N;
for(int i=1;i<=N;++i)
f>>v[i];
f.close();
min_val.resize(N+1);
for(int i=1;i<=N;++i)
min_val[i].first = INF;
int max_length = 0, max_pos, pos;
for(int i=1;i<=N;++i)
{
pos = solve(v, i, max_length, min_val);
if(pos == i)
{
best[i] = 1;
T[i] = i;
}
else
{
best[i] = 1 + best[pos];
T[i] = pos;
}
if(best[i] > max_length)
{
max_length = best[i];
max_pos = i;
}
if(min_val[ best[i] ].first > v[i])
{
min_val[ best[i] ].first = v[i];
min_val[ best[i] ].second = i;
}
}
vector<int> final;
int i;
for(i=max_pos; T[i] != i; i = T[i])
final.push_back(v[i]);
final.push_back(v[i]);
reverse(final.begin(), final.end());
ofstream g("scmax.out");
g<<max_length<<"\n";
for(auto it = final.begin(); it != final.end(); ++it)
g<<*it<<" ";
g.close();
return 0;
}