#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string>
#define DEFAULT_CAPACITY 3
typedef int Rank;
using namespace std;
template<typename T>
class Vector{
private:
Rank _size; int Capacity; T* _elem;
protected:
void copyFrom ( T const* A, Rank lo, Rank hi ){
_elem = new T[Capacity = 2*(hi-lo) ];
_size = 0;
while(lo<hi)
_elem[_size++] = A[lo++];
}
void expand(){
if(_size<Capacity)return;
T* oldElem = _elem;
_elem = new T[Capacity <<= 1];
for (int i = 0; i< _size;i++) {
_elem[i] = oldElem[i];
}
delete []oldElem;
}
T remove (Rank lo, Rank hi){
while(hi<_size)
_elem[lo++] = _elem[hi++];
_size = lo;
return hi - lo;
}
T remove (Rank n){
T e = _elem[n];
remove(n,n+1);
return e;
}
T find(T const& e,Rank lo,Rank hi){
while (lo < hi--&&e!=_elem[hi]) ;
return hi;
}
public:
Vector ( int c = DEFAULT_CAPACITY, int s = 0, T v = 0 ){
_elem = new T[Capacity = c]; for ( _size = 0; _size < s; _elem[_size++] = v );
}
Vector ( T const* A, Rank n ) { copyFrom ( A, 0, n ); }
~Vector() { delete [] _elem; }
void traverse(){
for (int i=0; i<_size; i++) {
cout << _elem[i]<<endl;
}
}
int deduplicate(){
int oldSize = _size;
Rank i = 1;
while ( i< _size)
(find(_elem[i],0,i)<0)?i++:remove(i);
return oldSize - _size;
}
int disordered(){
int n = 0;
for (int i = 1; i<_size; i++)
n+= (_elem[i-1]>_elem[i]);
return n;
}
int uniquify(){
Rank i =0 , j=0;
while(++j <_size)
if(_elem[j]!=_elem[i])_elem[++i]=_elem[j];
_size = ++i;
return j-i;
}
};