Submission #1309505

#TimeUsernameProblemLanguageResultExecution timeMemory
1309505ereringcmp (balkan11_cmp)C++20
100 / 100
1367 ms102320 KiB
#include <bits/stdc++.h>
#include "cmp.h"
using namespace std;
void remember(int n){
    int x=0;
    for(int i=11;i>=0;i--){
        int cur=(n>>i);
        if(i%2==0)bit_set(x+cur);
        x+=(1<<(12-i));
    }
}

int compare(int b) {
    vector<int> all={0,2,4,6,8,10};
    int st[12],x=0;
    for(int i=11;i>=0;i--){
        st[i]=x;
        x+=(1<<(12-i));
    }
    int l=0,r=all.size()-1;
    while(l<r){
        int mid=(l+r)/2;
        int val=all[mid];
        int pos=st[val]+(b>>val);
        if(bit_get(pos))r=mid;
        else l=mid+1;
    }
    //they are the same for suffix all[l] (unless all[l]=10 then maybe)
    if(l==0)return 0;
    int diff=all[l]-2; //they differ at either diff or diff+1;
    if(all[l]==10){
        int pos=st[10]+(b>>10);
        if(!bit_get(pos))diff=10;
    }
  //  if(b==1386)cout<<diff<<endl;
    if(((b>>(diff+1))&1)==((b>>diff)&1)){
        if((b>>diff)&1)return 1;
        return -1;
    }
    if((b>>(diff+1))&1){
        int val=st[diff]+(b>>diff)+1;
        if(bit_get(val))return -1;
        return 1;
    }
    int val=st[diff]+(b>>diff)-1;
   // if(b==1386)cout<<val<<endl;
    if(bit_get(val))return 1;
    return -1;
}

#Verdict Execution timeMemoryGrader output
Fetching results...