#include int binSearchFirst(a,N,key) int *a; int N,key; { // Finds index of first slot with a key >= a given key // WARNING - Returns -1 if keya[n-1] int low,high,mid; low=0; high=N-1; while (low<=high) { mid=(low+high)/2; if (a[mid]<=key) low=mid+1; else high=mid-1; } return high; } main() { int tabSize; int *map,*bsCount,*bsIndex; int i,j,k,iMap,kMap,kCount; int command,temp; scanf("%d",&tabSize); map=(int*) malloc(tabSize*sizeof(int)); bsCount=(int*) malloc(tabSize*sizeof(int)); bsIndex=(int*) malloc(tabSize*sizeof(int)); if (!map || !bsCount || !bsIndex) { printf("malloc failed %d\n",__LINE__); exit(0); } for (i=0;i=tabSize) { printf("Ignored due to range error\n"); break; } printf("incrementing %d\n",k); kMap=map[k]; kCount=bsCount[kMap]; iMap=binSearchLast(bsCount,tabSize,kCount); i=bsIndex[iMap]; bsCount[iMap]++; bsIndex[kMap]=i; bsIndex[iMap]=k; map[k]=iMap; map[i]=kMap; break; case 4: scanf("%d",&k); if (k<0 || k>=tabSize) { printf("Ignored due to range error\n"); break; } printf("decrementing %d\n",k); kMap=map[k]; kCount=bsCount[kMap]; iMap=binSearchFirst(bsCount,tabSize,kCount); i=bsIndex[iMap]; bsCount[iMap]--; bsIndex[kMap]=i; bsIndex[iMap]=k; map[k]=iMap; map[i]=kMap; break; default: printf("exiting due to invalid case\n"); exit(0); } } }