#include <iostream>
#include <vector>

using namespace std;

template <typename Iterator>
struct IteratorRange{

  Iterator begin () const {
	return first;
  }
  Iterator end() const {
	return last;
  }
  size_t size(){
    size_t cnt = 0;
    while ( first < last ){
      cnt++;
      first++;
    }
	return cnt;
  }

  Iterator first, last;

};

template <typename T>
class Slicer{
 public:
	Slicer( T begin, T end, size_t page_size ){
	  this->Begin = begin;
	  this->End = end;
	  this->page_size = page_size;
	  CutOnPage();
	}

	size_t size() const{
	  return pages.size();
	}

	typename vector<IteratorRange<T>>::iterator begin(){
	  return pages.begin();
	}
  	typename vector<IteratorRange<T>>::iterator end(){
	  return pages.end();
	}

	void CutOnPage(){
	  T current_begin = this->Begin;
	  while ( current_begin != this->End ){
		pages.push_back({ current_begin, current_begin });
	    while ( pages.back().last != this->End && pages.back().size() <= this->page_size ){
			pages.back().last++;
	    }
        current_begin = pages.back().last;
        if ( current_begin != this->End ) {
          current_begin++;
		}
	  }
	}

    T Begin, End;
    size_t page_size;
    vector <IteratorRange<T>> pages;

};

template <typename C>
Slicer <C> Slice(C&c, size_t page_size ){
	Slicer <C> main_pag(c.begin(), c.end(), page_size);
	return main_pag;
}

int main(){
  return 0;
}