The bolded "?" appears to be out of place. It looks like you're attempting to quantify the preceding "+" which is also a quantifier...
rewriteRule ^/?([^/]+?)?/?([0-9]+?)/([0-9]+?)$ index.php/%{THE_REQUEST} [NC]
The code has many other problems as well -- quantifier precedence being quite ambiguous in particular.
Rather than using multiple and un-prioritized "?" quantifiers trying to make bits and pieces of the requested URL-path optional, I suggest that you code this as a series of rules, each one *requiring* a certain number of parameters and slashes in the requested URL, and rewriting only valid URLs to your script. URLs which are missing slashes or have other defects should be detected and either redirected to the correct URLs, or allowed to return a 404-Not Found.
This will also reduce the number of exclusions you'll need to avoid recursion. (Note that your rule will rewrite /x/y to index.php/<request-line> and that the resulting index.php/<request-line> will then get rewritten to itself -- creating an infinite loop). Easy enough to prevent on the two-parameter version of this rule with a preceding RewriteCond:
RewriteCond %{REQUEST_URI} !/index\.php
Your ErrorDocument directive will cause massive problems with search ranking. As documented, the syntax you've used results in a 302-Found redirect to the 404 error page, so your server will never return a proper 404 status code for any requested URLs which do not resolve to files. Therefore, search engines will see an 'infinite URL-space' on your server, and will arbitrarily limit the depth to which they are willing to crawl your site.
The solution is simple. Use
ErrorDocument 404 /404.html
instead. And make it a habit to look up each Apache configuration directive and read the documentation before you use it. Otherwise, there are plenty of similar "SEO-suicide" traps waiting for you. It would be a pity to have a single typo or a small error literally put you out of business before you even get started...
Jim