Pagini recente » Profil Adriana_S | Cod sursa (job #1878175) | Cod sursa (job #1454089) | Cod sursa (job #1950149) | Cod sursa (job #2008075)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
//24 12 15 15 19
using namespace std;
int n;
vector<pair<int, int> > a (100002);
int d[100002], aib[100002], ans[100002], orig[100002];
void update (int pos, int val)
{
for(; pos <=n; pos+=pos&-pos)
if(val>aib[pos])
aib[pos]=val;
}
int query(int pos)
{
int curr = pos+1;
int maxim = 0;
for(;pos>0; pos-=pos&-pos)
if(aib[pos] > maxim)
{
maxim=aib[pos];
//prv[curr] = pos;
}
return maxim;
}
bool criteriu (const pair<int, int> a, const pair <int, int> b)
{
if(a.first==b.first)
return a.second > b.second;
return a.first < b.first;
}
int main()
{
int maxim=0, curr;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
pair <int, int> temp;
//a.push_back(temp);
in>>n;
for(int i=1;i<=n;++i)
{
in>>temp.first;
orig[i]=temp.first;
temp.second=i;
a[i]=temp;
//a.push_back(temp);
}
sort(a.begin()+1, a.begin()+n+1, criteriu);
for(int i=1;i<=n;++i)
{
d[a[i].second]=query(a[i].second -1) + 1;
update(a[i].second, d[a[i].second]);
}
for(int i=n;i;--i)
if(maxim<d[i])
{
maxim=d[i];
curr=i;
}
int j=2;
ans[1]=orig[curr];
for(int i=curr-1;i;--i)
if(d[i]==d[curr]-1)
{
ans[j]=orig[i];
curr=i;
++j;
}
out<<maxim<<"\n";
for(int i=maxim;i;--i)
out<<ans[i]<<" ";
return 0;
}