Pagini recente » Cod sursa (job #463647) | Cod sursa (job #2741540)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>
using namespace std;
ifstream be("scmax.in");
ofstream ki("scmax.out");
/*void build_arr(vector<int>&a,int n)
{
set<int>s;
for(int i=0;i<n;i++)
s.insert(a[i]);
int idx=0;
map<int,int>mp;
set<int>::iterator it;
for( it = s.begin();it!=s.end();it++)
{
idx++;
mp[*it]=idx;
}
for(int i=0;i<n;i++)
a[i]=mp[a[i]];
}
int query(vector<int> &bitr,int idx)
{
int s=0;
int i=0;
while(idx>0)
{
s=max(s,bitr[idx]);
idx-=idx&(-idx);
}
return s;
}
void update(vector<int>&bitr,int idx,int n)
{
int x=query(bitr,idx-1);
int val=x+1;
while(idx<=n)
{
bitr[idx]=max(bitr[idx],val);
idx=idx+(idx&(-idx));
}
}
*/
int binkeres(vector<int>&a,vector<int>&t,int l,int r,int x)
{
while(r-l>1)
{
int m=l+(r-l)/2;
if(a[t[m]]>=x)
r=m;
else
l=m;
}
return r;
}
void lis(vector<int>&a,int n)
{
vector<int>idx(n,0);
vector<int>idxprev(n,-1);
vector<int>sol(n);
int len=1;
for(int i=1;i<n;i++){
if(a[i]<a[idx[0]])
idx[0]=i;
else if(a[i]>a[idx[len-1]])
{
idxprev[i]=idx[len-1];
idx[len++]=i;
}
else{
int pos=binkeres(a,idx,-1,len-1,a[i]);
idxprev[i]=idx[pos-1];
idx[pos]=i;
}
}
ki<<len<<endl;
int k=0;
for(int i=idx[len-1];i>=0;i=idxprev[i])
{
sol[k++]=a[i];
}
for(int i=len-1;i>=0;i--)
ki<<sol[i]<<" ";
ki<<endl;
}
int main()
{
int n;
be>>n;
vector<int>a(n+1,0);
for(int i=0;i<n;i++)
{
int x;
be>>x;
a[i]=x;
}
lis(a,n);
return 0;
}