Pagini recente » Monitorul de evaluare | Cod sursa (job #2016827) | Cod sursa (job #486547) | Cod sursa (job #961666) | Cod sursa (job #2008031)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
//24 12 15 15 19
using namespace std;
int n;
vector<pair<int, int> > a;
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, h=1;
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.push_back(temp);
}
//for(int i=1;i<=n;++i)
//cout<<a[i].first<<","<<a[i].second<<" ";
//cout<<endl;
sort(a.begin()+1, a.end(), criteriu);
//for(int i=1;i<=n;++i)
//cout<<a[i].first<<","<<a[i].second<<" ";
//cout<<endl;
/*for(int i=2;i<=n;++i) //foru asta retard ne scapa de dubluri - oricum nu ne trebe
{
if(a[h].first!=a[i].first)
{
++h;
a[h]=a[i];
}
}
for(int i=1;i<=h;++i)
cout<<a[i].first<<","<<a[i].second<<" ";
cout<<endl;*/
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;
}
//cout<<"CURR "<<curr<<" CURR\n";
int j=2;
ans[1]=orig[curr];
for(int i=curr-1;i;--i)
if(orig[i]!=orig[i+1])
{
ans[j]=orig[i];
++j;
}
//cout<<"CURR "<<j<<" CURR\n";
//for(int i=1;i<=n;++i)
// cout<<d[i]<<" ";
//cout<<endl;
out<<maxim<<"\n";
for(int i=maxim;i;--i)
out<<ans[i]<<" ";
return 0;
}