Pagini recente » Cod sursa (job #2436284) | Cod sursa (job #1468095) | Cod sursa (job #2698653) | Cod sursa (job #601963) | Cod sursa (job #2908532)
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int caut(vector<int> &V, int t, int c1, int c2)
{
int ans = 0;
while (c2 >= c1)
{
int m = (c1 + c2) / 2;
if (t > V[m])
c1 = m + 1;
else
{
c2 = m - 1;
ans = m;
}
}
if (t <= V[ans])
return ans;
else
return -1;
}
int caut2_0(vector< pair<int, int> > &V, int t, int c1, int c2)
{
int ans = 0;
while (c2 >= c1)
{
int m = (c1 + c2) / 2;
if (t > V[m].first)
c1 = m + 1;
else
{
c2 = m - 1;
ans = m;
}
}
if (t <= V[ans].first)
return ans;
else
return -1;
}
bool rule(pair<int, int> a, pair<int, int> b)
{
return a.first < b.first;
}
int main()
{
int n;
in>> n;
vector<int> v(n), Lmin;
vector< pair<int, int> > iv(n);
for (int i = 0; i < n; i++)
in>> v[i];
Lmin.push_back(v[0]);
iv[0] = make_pair(v[0], 0);
int nr = 1;
for (int i = 1; i < n; i++)
{
int poz = caut(Lmin, v[i], 0, nr - 1);
if (poz == -1)
{
Lmin.push_back(v[i]);
iv[i] = make_pair(v[i], Lmin[nr - 1]);
nr++;
}
else
{
if(poz == 0)
iv[i] = make_pair(v[i], 0);
else
iv[i] = make_pair(v[i], Lmin[poz - 1]);
Lmin[poz] = v[i];
}
}
sort(iv.begin(), iv.end(), rule);
out<< nr << "\n";
int c;
c = caut2_0(iv, Lmin[nr - 1], 0, n);
v[0] = iv[c].first;
c = iv[c].second;
for (int i = 1; i < nr; i++)
{
c = caut2_0(iv, c, 0, n);
v[i] = iv[c].first;
c = iv[c].second;
}
for (int i = nr - 1; i >= 0; i--)
out<< v[i] << " ";
return 0;
}