Q: why there's a category “Input Iterator” at all, where is it used? (Output iterator is a similar story, so this post will omit it.)
I think the only major use is input stream.
There are some algorithms like std::merge(…) that require a tiny *subset* of a C pointer's full capabilities.
To make merge() useful on an input stream, STL authors put the Dummy type name “InputIterator” into merge() template declaration as a *hint* — a hint that in the implementation, only that *subset* of pointer capabilities are used. This is a hint to containers
It turned out all containers except output stream has that capability.