Pagini recente » Cod sursa (job #1090288) | Cod sursa (job #3203729) | Cod sursa (job #1550424) | Cod sursa (job #1609369) | Cod sursa (job #3123371)
/*#include <fstream>
#include <vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
struct multime
{
int best = 0;
vector<pair<int, int>> vec;
};
int n;
int ind = 0;
multime v[100005];
vector<int> ans;
int cb(int x)
{
int st = 1;
int dr = ind;
int m;
int poz = 0;
while(st <= dr)
{
m = (st + dr) / 2;
if(v[m].vec[v[m].best].first >= x)
{
poz = m;
dr = m - 1;
}
else
{
st = m + 1;
}
}
return poz;
}
int main()
{
in>>n;
int x, poz;
in>>x;
ind++;
v[ind].vec.push_back({0, 0});
v[ind].best++;
v[ind].vec.push_back({x, 0});
for(int i = 2; i<=n; i++)
{
in>>x;
poz = cb(x);
if(poz == 0)
{
ind++;
v[ind].vec.push_back({0, 0});
v[ind].best++;
v[ind].vec.push_back({x, v[ind-1].best});
}
else
{
v[poz].best++;
v[poz].vec.push_back({x, v[ind-1].best});
}
}
out<<ind<<'\n';
for(int i = 1; i<=ind; i++)
{
for(int j = 1; j<=v[i].best; j++)
{
out<<v[i].vec[j].first<<" "<<v[i].vec[j].second<<'\n';
}
out<<'\n';
}
pair<int, int> act = v[ind].vec[v[ind].best];
for(int i = ind; i>=1; i--)
{
ans.push_back(act.first);
if(i == 1)
{
break;
}
act = v[i-1].vec[act.second];
}
for(int i = ans.size()-1; i>=0; i--)
{
out<<ans[i]<<" ";
}
return 0;
}*/
#include <stdio.h>
int n, v[100003], best[100003], p[100003], maxim, k, L[100003], nr;
void afis(int i)
{
if (p[i] > 0) afis(p[i]);
printf("%d ",v[i]);
}
int caut(int x)
{
int p, u, m;
p = 0; u = nr; m = (p+u)/2;
while (p <= u)
{
if (v[L[m]] < x && v[L[m+1]] >= x) return m;
else if (v[L[m+1]] < x) {p = m + 1; m = (p + u)/2;}
else {u = m - 1; m = (p + u)/2;}
}
return nr;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int i, j, poz;
nr = 1;
scanf("%d",&n);
for (i = 1; i <= n; i++) scanf("%d", v + i);
best[1] = L[1] = 1; L[0] = 0;
for (i = 2; i <= n; i++)
{
poz = caut(v[i]);
p[i] = L[poz];
best[i] = poz + 1;
L[poz + 1] = i;
if (nr < poz + 1) nr = poz + 1;
}
maxim = 0; poz = 0;
for (i = 1; i <= n; i++)
if (maxim < best[i])
{
maxim = best[i]; poz = i;
}
printf("%d\n",maxim);
afis(poz);
return 0;
}