# include using namespace std; const long long maxn = 1e6; long long a[maxn],b[maxn],dp[maxn]; map mp,ll; long long last; struct Segment{ long long segm[maxn]; void update(long long v, long long from, long long to, long long d, long long x) { if(from==to&&from==d) { segm[v] = max(segm[v],x); return ; } long long mid = (from+to)/2; if(d<=mid)update(2*v,from,mid,d,x); else update(2*v+1,mid+1,to,d,x); segm[v] = max(segm[2*v],segm[2*v+1]); // cout<>>"<r)return 0; if(l<=from&&to<=r){//cout<<"RETURN: "<mid)ans=max(ans,query(2*v+1,mid+1,to,l,r)); return ans; } }; Segment S; void solve() { long long n; cin>>n; last = 0; long long i,j; mp.clear(); ll.clear(); memset(S.segm,0,sizeof(S.segm)); for(i=1;i<=n;i++) { cin>>a[i]; b[i] = a[i]; } sort(b+1,b+n+1); long long prev= -1; long long pos = 0; for(i=1;i<=n;i++) { if(b[i]!=prev)pos++; prev= b[i]; mp[b[i]] = pos; } long long ans = 0; for(i=1;i<=n;i++) { long long tx= S.query(1,1,pos,1,mp[a[i]]-1); dp[i] = tx; //cout<<"**"<>t; while(t--)solve(); }