O(lgN)