- #include <iostream> 
- #include <algorithm> 
-   
- template<typename T, size_t L, size_t H> 
- class Array 
- { 
- public: 
-     static_assert(H >= L); 
-     static const size_t Low = L; 
-     static const size_t High = H; 
-     static const size_t Length = (H - L + 1); 
-   
-     // stuff ... 
-   
-     Array() = default; 
-   
-     template<size_t Lb, size_t Hb> 
-     Array(const Array<T, Lb, Hb> &src) 
-     { 
-         static_assert(Length == Array<T, Lb, Hb>::Length); 
-         std::copy_n(src.actualArray, Length, actualArray); 
-     } 
-   
-     // just to show that you don't need an offset member... 
-   
-     T& operator[](size_t idx) 
-     { 
-         return actualArray[idx - L]; 
-     } 
-   
-     T operator[](size_t idx) const 
-     { 
-         return actualArray[idx - L]; 
-     } 
-   
-     template<typename, size_t, size_t> 
-     friend class Array; 
-   
- private: 
-     T actualArray[Length]; 
- }; 
-   
- template<typename T, size_t L, size_t H> 
- void printArray(const Array<T, L, H> &arr) 
- { 
-     for (size_t idx = arr.Low; idx <= arr.High; ++idx) 
-         std::cout << arr[idx] << std::endl; 
- } 
-   
- int main() 
- { 
-     Array<int, 0, 2> arr1; 
-     arr1[0] = 1; 
-     arr1[1] = 2; 
-     arr1[2] = 3; 
-     printArray(arr1); 
-   
-     std::cout << std::endl; 
-   
-     Array<int, 5, 7> arr2; 
-     arr2 = arr1; 
-     printArray(arr2); 
-   
-     return 0; 
- } 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IEwsIHNpemVfdCBIPgpjbGFzcyBBcnJheQp7CnB1YmxpYzoKICAgIHN0YXRpY19hc3NlcnQoSCA+PSBMKTsKICAgIHN0YXRpYyBjb25zdCBzaXplX3QgTG93ID0gTDsKICAgIHN0YXRpYyBjb25zdCBzaXplX3QgSGlnaCA9IEg7CiAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IExlbmd0aCA9IChIIC0gTCArIDEpOwoKICAgIC8vIHN0dWZmIC4uLgoKICAgIEFycmF5KCkgPSBkZWZhdWx0OwogICAgCiAgICB0ZW1wbGF0ZTxzaXplX3QgTGIsIHNpemVfdCBIYj4KICAgIEFycmF5KGNvbnN0IEFycmF5PFQsIExiLCBIYj4gJnNyYykKICAgIHsKICAgICAgICBzdGF0aWNfYXNzZXJ0KExlbmd0aCA9PSBBcnJheTxULCBMYiwgSGI+OjpMZW5ndGgpOwogICAgICAgIHN0ZDo6Y29weV9uKHNyYy5hY3R1YWxBcnJheSwgTGVuZ3RoLCBhY3R1YWxBcnJheSk7CiAgICB9CgogICAgLy8ganVzdCB0byBzaG93IHRoYXQgeW91IGRvbid0IG5lZWQgYW4gb2Zmc2V0IG1lbWJlci4uLgoKICAgIFQmIG9wZXJhdG9yW10oc2l6ZV90IGlkeCkKICAgIHsKICAgICAgICByZXR1cm4gYWN0dWFsQXJyYXlbaWR4IC0gTF07CiAgICB9CgogICAgVCBvcGVyYXRvcltdKHNpemVfdCBpZHgpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIGFjdHVhbEFycmF5W2lkeCAtIExdOwogICAgfQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lLCBzaXplX3QsIHNpemVfdD4KICAgIGZyaWVuZCBjbGFzcyBBcnJheTsKICAgIApwcml2YXRlOgogICAgVCBhY3R1YWxBcnJheVtMZW5ndGhdOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IEwsIHNpemVfdCBIPgp2b2lkIHByaW50QXJyYXkoY29uc3QgQXJyYXk8VCwgTCwgSD4gJmFycikKewogICAgZm9yIChzaXplX3QgaWR4ID0gYXJyLkxvdzsgaWR4IDw9IGFyci5IaWdoOyArK2lkeCkKICAgICAgICBzdGQ6OmNvdXQgPDwgYXJyW2lkeF0gPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpCnsKICAgIEFycmF5PGludCwgMCwgMj4gYXJyMTsKICAgIGFycjFbMF0gPSAxOwogICAgYXJyMVsxXSA9IDI7CiAgICBhcnIxWzJdID0gMzsKICAgIHByaW50QXJyYXkoYXJyMSk7CgogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgQXJyYXk8aW50LCA1LCA3PiBhcnIyOwogICAgYXJyMiA9IGFycjE7CiAgICBwcmludEFycmF5KGFycjIpOwoKICAgIHJldHVybiAwOwp9