If there was such a structure, everyone would use it instead of arrays.
However, I reckon a closer structure that I've been told of in a university lecture. It has a constant access time and the time to add/remove an element to an arbitrary position is mostly O(sqrt(N)) and only when N crosses square of integer value, it takes O(N). Amortized time is O(sqrt(N)). Here's the idea.
N items in this structure are stored in a contiguous array, which is divided in sqrt(N) chunks of sqrt(N) contiguous elements (perhaps, the last chunk contains less elements). Every chunk is a ring buffer, for which the position of the first element is stored in a separate array of sqrt(N). To access an element, you should determine what chunk it's in (takes one division), and do a proper shift within the ring buffer (sum and modulus). This is a constant time to access.
To add an element before i-th position, determine the chunk k
the element will end up in, then mark all last elements in each chunk in k
..sqrt(N)-1
range. Shift marked element in pre-last chunk to the free slot in a last chunk that will be the head of a ring buffer there (access additional array to determine where exactly). Then to the position of the moved element from the pre-last chunk move the marked element from pre-pre-last chunk. Repeat this and you'll get a free slot in the middle of array to place the element you were going to add.
The magic is that you should only increase values in additional array by one (takes O(sqrt(N)) time), thus making the structure consistent to access again. The magic of sqrt(N) is also here: you should operate on each of X chunks and on each of N/X elements of an auxilliary array. min(X + N/X) is reached for X = sqrt(N).
If there's no place in last chunk to add one more element (i.e. the sqrt(N) used so far is too small), repack the array with sqrt(N) increased by one. This takes O(N) time. Amortized time is still O(sqrt(N)) per element.
Therefore, adding an element in an arbitrary place of array takes O(sqrt(N)). Deletion takes the same time. Access time takes O(1).
That's the idea. I don't know how it's called, and professor didn't know either because he invented it on his own. Any reference would be appreciated. And the OP could implement it, but, I bet, someone already has.