Description
Peter would like to find another sequence b_1,b_2,...,b_n in such a manner that F(a_1,a_2,...,a_n) equals to F(b_1,b_2,...,b_n). Among all the possible sequences consisting of only positive integers, Peter wants the lexicographically smallest one.
The sequence a_1, a_2, ..., a_n is lexicographically smaller than sequence b_1, b_2, ..., b_n, if there is such number i from 1 to n, that a_k = b_k for 1 \le k < i and a_i < b_i.
Input
The first contains an integer n (1 \le n \le 100000) -- the length of the sequence. The second line contains n integers a_1,a_2,...,a_n (1 \le a_i \le 10^9).
Output
Sample Input
3 1 10 5 5 4 3 2 1 3 1 3 5
Sample Output
1 1 1 1 1 1 1 2 3
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn = 100010;
int a[maxn],dp[maxn];
int n,t;
int main(){
scanf("%d",&t);
while(t--){
int ac = 0;
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
scanf("%d",&n);
scanf("%d",&ac);
a[1] = ac;
int len = 1;
dp[1] = 1;
for(int i=2; i<=n; i++){
scanf("%d",&ac);
if(a[len]<ac){
a[++len] = ac; dp[i] = len;
}
else{
int k = lower_bound(a+1,a+1+len,ac) - a;
a[k] = ac;
dp[i] = k;
}
}
for(int i=1; i<=n; i++){
printf("%d%c",dp[i],i == n?'\n':' ');
}
}
return 0;
}