Pagini recente » Cod sursa (job #1448239) | Cod sursa (job #737053) | Cod sursa (job #1270710) | Cod sursa (job #42345) | Cod sursa (job #2291389)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector <int> sequence;
stack <int> rasp;
int n, lmax;
int v[100005];
int parent[100005];
int caut_bin(int elem)
{
int st = 0, dr = sequence.size() - 1, m;
while (st < dr)
m = (st + dr) >> 1,(sequence[m] < elem) ? st = ++m : dr = m;
return st;
}
int main()
{
fin >> n;
int i = 0, ex;
while(fin >> v[i++]);
int pos;
sequence.push_back(0);
lmax = 1;
for (i = 1; i < n; i++)
{
ex = sequence.back();
if (v[i] < v[sequence[0]])
{
sequence[0] = i;
}
else if (v[i] > v[ex])
{
//cout << " ba " << v[i] << endl;
//parent[i] = parent[ex];
parent[i] = sequence[lmax - 1];
sequence.push_back(i);
lmax++;
}
else
{
pos = caut_bin(v[i]);
// if(v[pos] != v[i])
parent[i] = sequence[pos - 1];
sequence[pos] = i;
//else
//{
// while (sequence[pos] == v[i])
// {
// pos++;
//}
//sequence[pos] = i;
//parent[i] = sequence[pos - 1];
//parent[i] = parent[pos] + 1;
//}
//cout << v[i] << " pus pe " << pos << " si " << v[sequence[pos - 1]] << " cu " << v[sequence[pos]] << endl;
}
}
//fout << sequence.size();
fout << sequence.size() << endl;
//rasp.push(sequence.back() + 1);
//cout << sequence.size() << " " << sequence.back();
rasp.push(v[sequence.back()]);
lmax--;
while (lmax > 0)
{
i = parent[sequence.back()];
//rasp.push(i + 1);
rasp.push(v[i]);
sequence.pop_back();
lmax--;
}
while (!rasp.empty())
{
fout << rasp.top() << " ";
rasp.pop();
}
// for (i = 0 ; i < sequence.size(); i++)
// {
//cout << v[sequence[i]] << " ";
// }
return 0;
}