#include <iostream>
#include <cstdlib>
class IntArray {
public:
IntArray(const IntArray &rhs) {
size_ = rhs.size_;
data_ = new int[rhs.size_];
for (int i = 0; i < rhs.size_; ++i) {
data_[i] = rhs.data_[i];
}
}
explicit IntArray(int n) {
size_ = n;
data_ = new int[n];
}
IntArray(const IntArray &x, int begin, int end);
~IntArray() {
delete [] data_;
}
int Size() const { return size_; }
const IntArray Slice(int begin, int end) const;
int &At(int i) { return data_[i]; }
int At(int i) const { return data_[i]; }
int &operator[](int i) { return At(i); }
int operator[](int i) const { return At(i); }
const IntArray &operator=(const IntArray &rhs) {
if (this != &rhs) {
delete [] data_;
size_ = rhs.size_;
data_ = new int[rhs.size_];
for (int i = 0; i < rhs.size_; ++i) {
data_[i] = rhs.data_[i];
}
}
return *this;
}
private:
int size_;
int *data_;
};
IntArray::IntArray(const IntArray &x, int begin, int end) {
size_ = end-begin;
data_ = new int[size_];
for(int i=0; i<size_ ;++i){
data_[i] = x.At(i+begin);
}
}
const IntArray IntArray::Slice(int begin, int end) const {
IntArray TempIntArray(end-begin);
for(int i=0; i<end-begin ;i++){
TempIntArray.At(i) = this->At(i+begin);
}
return TempIntArray;
}
std::ostream &operator<<(std::ostream &lhs, const IntArray &rhs) {
for (int i = 0; i < rhs.Size(); ++i) {
if (i > 0) lhs << ' ';
lhs << rhs[i];
}
return lhs;
}
