class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length, size = 0;

        while(n > 0){
            n = n>>1;
            size++;
        }
        n = nums.length;
        int pivot = 0;
        

        for(int i = 0; i < n; i++){
            if(nums[i] <= 0 || nums[i] > n){
                int temp = nums[i];
                nums[i] = nums[pivot];
                nums[pivot] = temp;
                pivot++;
            }
        }
        for(int i= 0; i < pivot; i++)
            nums[i] = 0;
        for(int i= pivot; i < n; i++){
            nums[(nums[i] - 1)&((1<<size) - 1)] |= (1<<size);
        }
        for(int i= 0; i < n; i++)
            if((nums[i] & (1<<size)) == 0)
                return i+1;
        return n+1;
    }
}