Pagini recente » Cod sursa (job #2305215) | Cod sursa (job #1125899) | Cod sursa (job #2019610) | Cod sursa (job #362721) | Cod sursa (job #1276339)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
#include <queue>
#define Nmax 100001
using namespace std;
int solve(int v[], int pos, int max_length, priority_queue< pair<int, int> > heap[Nmax])
{
int left = 1, right = max_length, mid, value = v[pos], sol_pos = pos;
while(left <= right)
{
mid = (left + right)/2;
if(heap[mid].empty())
{
right = mid - 1;
continue;
}
auto it = heap[mid].top();
if((it.first) * (-1) < value)
{
sol_pos = it.second;
left = mid+1;
} else {
right = mid - 1;
}
}
return sol_pos;
}
int main()
{
int N, v[Nmax], best[Nmax], T[Nmax];
priority_queue< pair<int, int> > heap[Nmax];
ifstream f("scmax.in");
f>>N;
for(int i=1;i<=N;++i)
f>>v[i];
f.close();
int max_length = 0, max_pos;
for(int i=1;i<=N;++i)
{
int pos = solve(v, i, max_length, heap);
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;
}
heap[best[i]].push(make_pair(v[i] * (-1), 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;
}