int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
double* arr=(double*)calloc(*obstacleGridColSize,sizeof(double));
arr[(*obstacleGridColSize)-1]=1;
int i, r=obstacleGridSize;
if(obstacleGrid[0][0]==1 || obstacleGrid[r-1][(*obstacleGridColSize)-1]==1)
return 0;
while(--r>=0){
for(i=(*obstacleGridColSize)-1; i>=0; i--)
arr[i]+= (obstacleGrid[r][i])?-arr[i] :(i+1<*obstacleGridColSize)?arr[i+1] :0;
}
return (int)*arr;
}
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
double* arr=(double*)calloc(*obstacleGridColSize,sizeof(double));
arr[(*obstacleGridColSize)-1]=1;
int i, r=obstacleGridSize;
if(obstacleGrid[0][0]==1 || obstacleGrid[r-1][(*obstacleGridColSize)-1]==1)
return 0;
while(--r>=0){
for(i=(*obstacleGridColSize)-1; i>=0; i--)
arr[i]+= (obstacleGrid[r][i])?-arr[i] :(i+1<*obstacleGridColSize)?arr[i+1] :0;
}
return (int)*arr;
}