Cod sursa(job #2221507)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 14 iulie 2018 16:00:15
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
using namespace std;

int n, a[100005], b[100005], dp[100005], next[100005];
int aint[400005];
unordered_map<int, int> norm;

void update(int nod, int l, int r, int p, int v) {
   if (l==r) aint[nod]=v;
   else {
      int mid=(l+r)/2;
   
      if (p<=mid) update(2*nod,l,mid,p,v);
      else update(2*nod+1,mid+1,r,p,v);
      
      aint[nod]=max(aint[2*nod],aint[2*nod+1]);
   }
	
}

int query(int nod, int l, int r, int a) {
   if (l>=a) return aint[nod];
   else {
      int mid=(l+r)/2;
      int m1 = 0, m2=0;
      
      if (a<=mid) m1=query(2*nod,l,mid,a);
      m2=query(2*nod+1,mid+1,r,a);
   
      return max(m1,m2);
   }
	
	
}

int main(void) {
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
   
   	cin>>n;
   	for (int i=1; i<=n; ++i) { cin>>a[i]; b[i]=a[i]; }
   	
   	sort(b+1,b+n+1);
   	int aux=1;
   	norm[b[1]]=aux;
   	
   	for (int i=2; i<=n; ++i) 
   	 if (b[i]!=b[i-1]) {
   	    ++aux;
		norm[b[i]]=aux;
   	 }
   	 
   	dp[n]=1;
   	
   	int sol=1;
   	int st=n;
   	
   	update(1,1,n,norm[a[n]],1);
   	for (int i=n-1; i>=1; --i) {
   	   dp[i]=query(1,1,n,norm[a[i]]+1)+1;
	   update(1,1,n,norm[a[i]],dp[i]);	
   	   if (dp[i]>sol) { sol=dp[i]; st=i; }
   	}
   	
   	cout<<sol<<"\n";
   	cout<<a[st]<<" ";
   	for (int i=st+1; i<=n; ++i)
   	 if (dp[i]==dp[st]-1 && a[i]>a[st]) {
   	    cout<<a[i]<<" ";
		st=i;	
   	 }
	
	return 0;
}