#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#define MAXN 13
#define MAX_MASK 8192
#define setbit(x, i) ((x) | (1 << (i)))
#define resetbit(x, i) ((x) & (~(1 << (i))))

int next[MAX_MASK][MAXN]; /// next[bitmask][cur] = next lis mask when the current lis mask is bitmask and cur is added to the end

void Generate(){
    int i, cur, res, bitmask;
    memset(next, -1, sizeof(next));

    for (bitmask = 0; bitmask < MAX_MASK; bitmask++){
        for (cur = 0; cur < MAXN; cur++){
            if (bitmask == 0) next[bitmask][cur] = 1 << cur;
            else{
                res = setbit(bitmask, cur);
                for (i = cur + 1; i < MAXN; i++){ /// Find the smallest number (if there are any) with a set bit greater than cur and reset it
                    if (bitmask & (1 << i)){
                        res = resetbit(res, i);
                        break;
                    }
                }
                next[bitmask][cur] = res;
            }
        }
    }
}

int main(){
    Generate();
}
