#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> int coordcomp_L( int n, T arr[ ] , int res[ ] = NULL , void * mem = wmem) {
int i;
int k = 0 ;
pair< T,int > * r;
walloc1d( & r, n, & mem) ;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
r[ i] .first = arr[ i] ;
r[ i] .second = i;
}
sort( r, r+ n) ;
if ( res ! = NULL ) {
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
if ( i && r[ i] .first ! = r[ i- 1 ] .first ) {
k++ ;
}
res[ r[ i] .second ] = k;
}
}
else {
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
if ( i && r[ i] .first ! = r[ i- 1 ] .first ) {
k++ ;
}
arr[ r[ i] .second ] = k;
}
}
return k+ 1 ;
}
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
int N;
int A[ 100000 ] ;
class Solution{
public :
vector< int > arrayRankTransform( vector< int > & arr) {
int i;
dummy_main( ) ;
N = arr.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
A[ i] = arr[ i] ;
}
coordcomp_L( N, A) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] = A[ i] + 1 ;
}
return arr;
}
}
;
// cLay varsion 20200119-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int N, A[1d5];
//
// class Solution {
// public:
// vector<int> arrayRankTransform(vector<int>& arr) {
// dummy_main();
// N = arr.size();
// rep(i,N) A[i] = arr[i];
// coordcomp(N, A);
// rep(i,N) arr[i] = A[i]+1;
// return arr;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQgKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbnQgY29vcmRjb21wX0woaW50IG4sIFQgYXJyW10sIGludCByZXNbXSA9IE5VTEwsIHZvaWQgKm1lbSA9IHdtZW0pewogIGludCBpOwogIGludCBrID0gMDsKICBwYWlyPFQsaW50PiAqcjsKICB3YWxsb2MxZCgmciwgbiwgJm1lbSk7CiAgZm9yKGk9KDApO2k8KG4pO2krKyl7CiAgICByW2ldLmZpcnN0ID0gYXJyW2ldOwogICAgcltpXS5zZWNvbmQgPSBpOwogIH0KICBzb3J0KHIsIHIrbik7CiAgaWYocmVzICE9IE5VTEwpewogICAgZm9yKGk9KDApO2k8KG4pO2krKyl7CiAgICAgIGlmKGkgJiYgcltpXS5maXJzdCAhPSByW2ktMV0uZmlyc3QpewogICAgICAgIGsrKzsKICAgICAgfQogICAgICByZXNbcltpXS5zZWNvbmRdID0gazsKICAgIH0KICB9CiAgZWxzZXsKICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICBpZihpICYmIHJbaV0uZmlyc3QgIT0gcltpLTFdLmZpcnN0KXsKICAgICAgICBrKys7CiAgICAgIH0KICAgICAgYXJyW3JbaV0uc2Vjb25kXSA9IGs7CiAgICB9CiAgfQogIHJldHVybiBrKzE7Cn0KI2RlZmluZSBtYWluIGR1bW15X21haW4KaW50IG1haW4oKXsKICB3bWVtID0gbWVtYXJyOwogIHJldHVybiAwOwp9CiN1bmRlZiBtYWluCmludCBOOwppbnQgQVsxMDAwMDBdOwpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgdmVjdG9yPGludD4gYXJyYXlSYW5rVHJhbnNmb3JtKHZlY3RvcjxpbnQ+JiBhcnIpewogICAgaW50IGk7CiAgICBkdW1teV9tYWluKCk7CiAgICBOID0gYXJyLnNpemUoKTsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBBW2ldID0gYXJyW2ldOwogICAgfQogICAgY29vcmRjb21wX0woTiwgQSk7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgYXJyW2ldID0gQVtpXSsxOwogICAgfQogICAgcmV0dXJuIGFycjsKICB9Cn0KOwovLyBjTGF5IHZhcnNpb24gMjAyMDAxMTktMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBpbnQgTiwgQVsxZDVdOwovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgdmVjdG9yPGludD4gYXJyYXlSYW5rVHJhbnNmb3JtKHZlY3RvcjxpbnQ+JiBhcnIpIHsKLy8gICAgIGR1bW15X21haW4oKTsKLy8gICAgIE4gPSBhcnIuc2l6ZSgpOwovLyAgICAgcmVwKGksTikgQVtpXSA9IGFycltpXTsKLy8gICAgIGNvb3JkY29tcChOLCBBKTsKLy8gICAgIHJlcChpLE4pIGFycltpXSA9IEFbaV0rMTsKLy8gICAgIHJldHVybiBhcnI7Ci8vICAgfQovLyB9Owo=