/******************************************************************************
Online C++ Compiler.
Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <stdint.h>
#include <array>
#include <type_traits>
namespace Chess_Lookup {
static constexpr uint64_t GetSliderHCond(uint64_t SliderSquare, uint64_t occupy) {
uint64_t result{};
switch (SliderSquare) {
case 0:
result = 2ull;
if ((occupy & 2ull) == 0) result |= 4ull;
if ((occupy & 6ull) == 0) result |= 8ull;
if ((occupy & 14ull) == 0) result |= 16ull;
if ((occupy & 30ull) == 0) result |= 32ull;
if ((occupy & 62ull) == 0) result |= 64ull;
if ((occupy & 126ull) == 0) result |= 128ull;
return result;
case 1:
result = 5ull;
if ((occupy & 4ull) == 0) result |= 8ull;
if ((occupy & 12ull) == 0) result |= 16ull;
if ((occupy & 28ull) == 0) result |= 32ull;
if ((occupy & 60ull) == 0) result |= 64ull;
if ((occupy & 124ull) == 0) result |= 128ull;
return result;
case 2:
result = 10ull;
if ((occupy & 2ull) == 0) result |= 1ull;
if ((occupy & 8ull) == 0) result |= 16ull;
if ((occupy & 24ull) == 0) result |= 32ull;
if ((occupy & 56ull) == 0) result |= 64ull;
if ((occupy & 120ull) == 0) result |= 128ull;
return result;
case 3:
result = 20ull;
if ((occupy & 4ull) == 0) result |= 2ull;
if ((occupy & 6ull) == 0) result |= 1ull;
if ((occupy & 16ull) == 0) result |= 32ull;
if ((occupy & 48ull) == 0) result |= 64ull;
if ((occupy & 112ull) == 0) result |= 128ull;
return result;
case 4:
result = 40ull;
if ((occupy & 8ull) == 0) result |= 4ull;
if ((occupy & 12ull) == 0) result |= 2ull;
if ((occupy & 14ull) == 0) result |= 1ull;
if ((occupy & 32ull) == 0) result |= 64ull;
if ((occupy & 96ull) == 0) result |= 128ull;
return result;
case 5:
result = 80ull;
if ((occupy & 16ull) == 0) result |= 8ull;
if ((occupy & 24ull) == 0) result |= 4ull;
if ((occupy & 28ull) == 0) result |= 2ull;
if ((occupy & 30ull) == 0) result |= 1ull;
if ((occupy & 64ull) == 0) result |= 128ull;
return result;
case 6:
result = 160ull;
if ((occupy & 32ull) == 0) result |= 16ull;
if ((occupy & 48ull) == 0) result |= 8ull;
if ((occupy & 56ull) == 0) result |= 4ull;
if ((occupy & 60ull) == 0) result |= 2ull;
if ((occupy & 62ull) == 0) result |= 1ull;
return result;
case 7:
result = 64ull;
if ((occupy & 64ull) == 0) result |= 32ull;
if ((occupy & 96ull) == 0) result |= 16ull;
if ((occupy & 112ull) == 0) result |= 8ull;
if ((occupy & 120ull) == 0) result |= 4ull;
if ((occupy & 124ull) == 0) result |= 2ull;
if ((occupy & 126ull) == 0) result |= 1ull;
return result;
case 8:
result = 512ull;
if ((occupy & 512ull) == 0) result |= 1024ull;
if ((occupy & 1536ull) == 0) result |= 2048ull;
if ((occupy & 3584ull) == 0) result |= 4096ull;
if ((occupy & 7680ull) == 0) result |= 8192ull;
if ((occupy & 15872ull) == 0) result |= 16384ull;
if ((occupy & 32256ull) == 0) result |= 32768ull;
return result;
case 9:
result = 1280ull;
if ((occupy & 1024ull) == 0) result |= 2048ull;
if ((occupy & 3072ull) == 0) result |= 4096ull;
if ((occupy & 7168ull) == 0) result |= 8192ull;
if ((occupy & 15360ull) == 0) result |= 16384ull;
if ((occupy & 31744ull) == 0) result |= 32768ull;
return result;
case 10:
result = 2560ull;
if ((occupy & 512ull) == 0) result |= 256ull;
if ((occupy & 2048ull) == 0) result |= 4096ull;
if ((occupy & 6144ull) == 0) result |= 8192ull;
if ((occupy & 14336ull) == 0) result |= 16384ull;
if ((occupy & 30720ull) == 0) result |= 32768ull;
return result;
case 11:
result = 5120ull;
if ((occupy & 1024ull) == 0) result |= 512ull;
if ((occupy & 1536ull) == 0) result |= 256ull;
if ((occupy & 4096ull) == 0) result |= 8192ull;
if ((occupy & 12288ull) == 0) result |= 16384ull;
if ((occupy & 28672ull) == 0) result |= 32768ull;
return result;
case 12:
result = 10240ull;
if ((occupy & 2048ull) == 0) result |= 1024ull;
if ((occupy & 3072ull) == 0) result |= 512ull;
if ((occupy & 3584ull) == 0) result |= 256ull;
if ((occupy & 8192ull) == 0) result |= 16384ull;
if ((occupy & 24576ull) == 0) result |= 32768ull;
return result;
case 13:
result = 20480ull;
if ((occupy & 4096ull) == 0) result |= 2048ull;
if ((occupy & 6144ull) == 0) result |= 1024ull;
if ((occupy & 7168ull) == 0) result |= 512ull;
if ((occupy & 7680ull) == 0) result |= 256ull;
if ((occupy & 16384ull) == 0) result |= 32768ull;
return result;
case 14:
result = 40960ull;
if ((occupy & 8192ull) == 0) result |= 4096ull;
if ((occupy & 12288ull) == 0) result |= 2048ull;
if ((occupy & 14336ull) == 0) result |= 1024ull;
if ((occupy & 15360ull) == 0) result |= 512ull;
if ((occupy & 15872ull) == 0) result |= 256ull;
return result;
case 15:
result = 16384ull;
if ((occupy & 16384ull) == 0) result |= 8192ull;
if ((occupy & 24576ull) == 0) result |= 4096ull;
if ((occupy & 28672ull) == 0) result |= 2048ull;
if ((occupy & 30720ull) == 0) result |= 1024ull;
if ((occupy & 31744ull) == 0) result |= 512ull;
if ((occupy & 32256ull) == 0) result |= 256ull;
return result;
case 16:
result = 131072ull;
if ((occupy & 131072ull) == 0) result |= 262144ull;
if ((occupy & 393216ull) == 0) result |= 524288ull;
if ((occupy & 917504ull) == 0) result |= 1048576ull;
if ((occupy & 1966080ull) == 0) result |= 2097152ull;
if ((occupy & 4063232ull) == 0) result |= 4194304ull;
if ((occupy & 8257536ull) == 0) result |= 8388608ull;
return result;
case 17:
result = 327680ull;
if ((occupy & 262144ull) == 0) result |= 524288ull;
if ((occupy & 786432ull) == 0) result |= 1048576ull;
if ((occupy & 1835008ull) == 0) result |= 2097152ull;
if ((occupy & 3932160ull) == 0) result |= 4194304ull;
if ((occupy & 8126464ull) == 0) result |= 8388608ull;
return result;
case 18:
result = 655360ull;
if ((occupy & 131072ull) == 0) result |= 65536ull;
if ((occupy & 524288ull) == 0) result |= 1048576ull;
if ((occupy & 1572864ull) == 0) result |= 2097152ull;
if ((occupy & 3670016ull) == 0) result |= 4194304ull;
if ((occupy & 7864320ull) == 0) result |= 8388608ull;
return result;
case 19:
result = 1310720ull;
if ((occupy & 262144ull) == 0) result |= 131072ull;
if ((occupy & 393216ull) == 0) result |= 65536ull;
if ((occupy & 1048576ull) == 0) result |= 2097152ull;
if ((occupy & 3145728ull) == 0) result |= 4194304ull;
if ((occupy & 7340032ull) == 0) result |= 8388608ull;
return result;
case 20:
result = 2621440ull;
if ((occupy & 524288ull) == 0) result |= 262144ull;
if ((occupy & 786432ull) == 0) result |= 131072ull;
if ((occupy & 917504ull) == 0) result |= 65536ull;
if ((occupy & 2097152ull) == 0) result |= 4194304ull;
if ((occupy & 6291456ull) == 0) result |= 8388608ull;
return result;
case 21:
result = 5242880ull;
if ((occupy & 1048576ull) == 0) result |= 524288ull;
if ((occupy & 1572864ull) == 0) result |= 262144ull;
if ((occupy & 1835008ull) == 0) result |= 131072ull;
if ((occupy & 1966080ull) == 0) result |= 65536ull;
if ((occupy & 4194304ull) == 0) result |= 8388608ull;
return result;
case 22:
result = 10485760ull;
if ((occupy & 2097152ull) == 0) result |= 1048576ull;
if ((occupy & 3145728ull) == 0) result |= 524288ull;
if ((occupy & 3670016ull) == 0) result |= 262144ull;
if ((occupy & 3932160ull) == 0) result |= 131072ull;
if ((occupy & 4063232ull) == 0) result |= 65536ull;
return result;
case 23:
result = 4194304ull;
if ((occupy & 4194304ull) == 0) result |= 2097152ull;
if ((occupy & 6291456ull) == 0) result |= 1048576ull;
if ((occupy & 7340032ull) == 0) result |= 524288ull;
if ((occupy & 7864320ull) == 0) result |= 262144ull;
if ((occupy & 8126464ull) == 0) result |= 131072ull;
if ((occupy & 8257536ull) == 0) result |= 65536ull;
return result;
case 24:
result = 33554432ull;
if ((occupy & 33554432ull) == 0) result |= 67108864ull;
if ((occupy & 100663296ull) == 0) result |= 134217728ull;
if ((occupy & 234881024ull) == 0) result |= 268435456ull;
if ((occupy & 503316480ull) == 0) result |= 536870912ull;
if ((occupy & 1040187392ull) == 0) result |= 1073741824ull;
if ((occupy & 2113929216ull) == 0) result |= 2147483648ull;
return result;
case 25:
result = 83886080ull;
if ((occupy & 67108864ull) == 0) result |= 134217728ull;
if ((occupy & 201326592ull) == 0) result |= 268435456ull;
if ((occupy & 469762048ull) == 0) result |= 536870912ull;
if ((occupy & 1006632960ull) == 0) result |= 1073741824ull;
if ((occupy & 2080374784ull) == 0) result |= 2147483648ull;
return result;
case 26:
result = 167772160ull;
if ((occupy & 33554432ull) == 0) result |= 16777216ull;
if ((occupy & 134217728ull) == 0) result |= 268435456ull;
if ((occupy & 402653184ull) == 0) result |= 536870912ull;
if ((occupy & 939524096ull) == 0) result |= 1073741824ull;
if ((occupy & 2013265920ull) == 0) result |= 2147483648ull;
return result;
case 27:
result = 335544320ull;
if ((occupy & 67108864ull) == 0) result |= 33554432ull;
if ((occupy & 100663296ull) == 0) result |= 16777216ull;
if ((occupy & 268435456ull) == 0) result |= 536870912ull;
if ((occupy & 805306368ull) == 0) result |= 1073741824ull;
if ((occupy & 1879048192ull) == 0) result |= 2147483648ull;
return result;
case 28:
result = 671088640ull;
if ((occupy & 134217728ull) == 0) result |= 67108864ull;
if ((occupy & 201326592ull) == 0) result |= 33554432ull;
if ((occupy & 234881024ull) == 0) result |= 16777216ull;
if ((occupy & 536870912ull) == 0) result |= 1073741824ull;
if ((occupy & 1610612736ull) == 0) result |= 2147483648ull;
return result;
case 29:
result = 1342177280ull;
if ((occupy & 268435456ull) == 0) result |= 134217728ull;
if ((occupy & 402653184ull) == 0) result |= 67108864ull;
if ((occupy & 469762048ull) == 0) result |= 33554432ull;
if ((occupy & 503316480ull) == 0) result |= 16777216ull;
if ((occupy & 1073741824ull) == 0) result |= 2147483648ull;
return result;
case 30:
result = 2684354560ull;
if ((occupy & 536870912ull) == 0) result |= 268435456ull;
if ((occupy & 805306368ull) == 0) result |= 134217728ull;
if ((occupy & 939524096ull) == 0) result |= 67108864ull;
if ((occupy & 1006632960ull) == 0) result |= 33554432ull;
if ((occupy & 1040187392ull) == 0) result |= 16777216ull;
return result;
case 31:
result = 1073741824ull;
if ((occupy & 1073741824ull) == 0) result |= 536870912ull;
if ((occupy & 1610612736ull) == 0) result |= 268435456ull;
if ((occupy & 1879048192ull) == 0) result |= 134217728ull;
if ((occupy & 2013265920ull) == 0) result |= 67108864ull;
if ((occupy & 2080374784ull) == 0) result |= 33554432ull;
if ((occupy & 2113929216ull) == 0) result |= 16777216ull;
return result;
case 32:
result = 8589934592ull;
if ((occupy & 8589934592ull) == 0) result |= 17179869184ull;
if ((occupy & 25769803776ull) == 0) result |= 34359738368ull;
if ((occupy & 60129542144ull) == 0) result |= 68719476736ull;
if ((occupy & 128849018880ull) == 0) result |= 137438953472ull;
if ((occupy & 266287972352ull) == 0) result |= 274877906944ull;
if ((occupy & 541165879296ull) == 0) result |= 549755813888ull;
return result;
case 33:
result = 21474836480ull;
if ((occupy & 17179869184ull) == 0) result |= 34359738368ull;
if ((occupy & 51539607552ull) == 0) result |= 68719476736ull;
if ((occupy & 120259084288ull) == 0) result |= 137438953472ull;
if ((occupy & 257698037760ull) == 0) result |= 274877906944ull;
if ((occupy & 532575944704ull) == 0) result |= 549755813888ull;
return result;
case 34:
result = 42949672960ull;
if ((occupy & 8589934592ull) == 0) result |= 4294967296ull;
if ((occupy & 34359738368ull) == 0) result |= 68719476736ull;
if ((occupy & 103079215104ull) == 0) result |= 137438953472ull;
if ((occupy & 240518168576ull) == 0) result |= 274877906944ull;
if ((occupy & 515396075520ull) == 0) result |= 549755813888ull;
return result;
case 35:
result = 85899345920ull;
if ((occupy & 17179869184ull) == 0) result |= 8589934592ull;
if ((occupy & 25769803776ull) == 0) result |= 4294967296ull;
if ((occupy & 68719476736ull) == 0) result |= 137438953472ull;
if ((occupy & 206158430208ull) == 0) result |= 274877906944ull;
if ((occupy & 481036337152ull) == 0) result |= 549755813888ull;
return result;
case 36:
result = 171798691840ull;
if ((occupy & 34359738368ull) == 0) result |= 17179869184ull;
if ((occupy & 51539607552ull) == 0) result |= 8589934592ull;
if ((occupy & 60129542144ull) == 0) result |= 4294967296ull;
if ((occupy & 137438953472ull) == 0) result |= 274877906944ull;
if ((occupy & 412316860416ull) == 0) result |= 549755813888ull;
return result;
case 37:
result = 343597383680ull;
if ((occupy & 68719476736ull) == 0) result |= 34359738368ull;
if ((occupy & 103079215104ull) == 0) result |= 17179869184ull;
if ((occupy & 120259084288ull) == 0) result |= 8589934592ull;
if ((occupy & 128849018880ull) == 0) result |= 4294967296ull;
if ((occupy & 274877906944ull) == 0) result |= 549755813888ull;
return result;
case 38:
result = 687194767360ull;
if ((occupy & 137438953472ull) == 0) result |= 68719476736ull;
if ((occupy & 206158430208ull) == 0) result |= 34359738368ull;
if ((occupy & 240518168576ull) == 0) result |= 17179869184ull;
if ((occupy & 257698037760ull) == 0) result |= 8589934592ull;
if ((occupy & 266287972352ull) == 0) result |= 4294967296ull;
return result;
case 39:
result = 274877906944ull;
if ((occupy & 274877906944ull) == 0) result |= 137438953472ull;
if ((occupy & 412316860416ull) == 0) result |= 68719476736ull;
if ((occupy & 481036337152ull) == 0) result |= 34359738368ull;
if ((occupy & 515396075520ull) == 0) result |= 17179869184ull;
if ((occupy & 532575944704ull) == 0) result |= 8589934592ull;
if ((occupy & 541165879296ull) == 0) result |= 4294967296ull;
return result;
case 40:
result = 2199023255552ull;
if ((occupy & 2199023255552ull) == 0) result |= 4398046511104ull;
if ((occupy & 6597069766656ull) == 0) result |= 8796093022208ull;
if ((occupy & 15393162788864ull) == 0) result |= 17592186044416ull;
if ((occupy & 32985348833280ull) == 0) result |= 35184372088832ull;
if ((occupy & 68169720922112ull) == 0) result |= 70368744177664ull;
if ((occupy & 138538465099776ull) == 0) result |= 140737488355328ull;
return result;
case 41:
result = 5497558138880ull;
if ((occupy & 4398046511104ull) == 0) result |= 8796093022208ull;
if ((occupy & 13194139533312ull) == 0) result |= 17592186044416ull;
if ((occupy & 30786325577728ull) == 0) result |= 35184372088832ull;
if ((occupy & 65970697666560ull) == 0) result |= 70368744177664ull;
if ((occupy & 136339441844224ull) == 0) result |= 140737488355328ull;
return result;
case 42:
result = 10995116277760ull;
if ((occupy & 2199023255552ull) == 0) result |= 1099511627776ull;
if ((occupy & 8796093022208ull) == 0) result |= 17592186044416ull;
if ((occupy & 26388279066624ull) == 0) result |= 35184372088832ull;
if ((occupy & 61572651155456ull) == 0) result |= 70368744177664ull;
if ((occupy & 131941395333120ull) == 0) result |= 140737488355328ull;
return result;
case 43:
result = 21990232555520ull;
if ((occupy & 4398046511104ull) == 0) result |= 2199023255552ull;
if ((occupy & 6597069766656ull) == 0) result |= 1099511627776ull;
if ((occupy & 17592186044416ull) == 0) result |= 35184372088832ull;
if ((occupy & 52776558133248ull) == 0) result |= 70368744177664ull;
if ((occupy & 123145302310912ull) == 0) result |= 140737488355328ull;
return result;
case 44:
result = 43980465111040ull;
if ((occupy & 8796093022208ull) == 0) result |= 4398046511104ull;
if ((occupy & 13194139533312ull) == 0) result |= 2199023255552ull;
if ((occupy & 15393162788864ull) == 0) result |= 1099511627776ull;
if ((occupy & 35184372088832ull) == 0) result |= 70368744177664ull;
if ((occupy & 105553116266496ull) == 0) result |= 140737488355328ull;
return result;
case 45:
result = 87960930222080ull;
if ((occupy & 17592186044416ull) == 0) result |= 8796093022208ull;
if ((occupy & 26388279066624ull) == 0) result |= 4398046511104ull;
if ((occupy & 30786325577728ull) == 0) result |= 2199023255552ull;
if ((occupy & 32985348833280ull) == 0) result |= 1099511627776ull;
if ((occupy & 70368744177664ull) == 0) result |= 140737488355328ull;
return result;
case 46:
result = 175921860444160ull;
if ((occupy & 35184372088832ull) == 0) result |= 17592186044416ull;
if ((occupy & 52776558133248ull) == 0) result |= 8796093022208ull;
if ((occupy & 61572651155456ull) == 0) result |= 4398046511104ull;
if ((occupy & 65970697666560ull) == 0) result |= 2199023255552ull;
if ((occupy & 68169720922112ull) == 0) result |= 1099511627776ull;
return result;
case 47:
result = 70368744177664ull;
if ((occupy & 70368744177664ull) == 0) result |= 35184372088832ull;
if ((occupy & 105553116266496ull) == 0) result |= 17592186044416ull;
if ((occupy & 123145302310912ull) == 0) result |= 8796093022208ull;
if ((occupy & 131941395333120ull) == 0) result |= 4398046511104ull;
if ((occupy & 136339441844224ull) == 0) result |= 2199023255552ull;
if ((occupy & 138538465099776ull) == 0) result |= 1099511627776ull;
return result;
case 48:
result = 562949953421312ull;
if ((occupy & 562949953421312ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1688849860263936ull) == 0) result |= 2251799813685248ull;
if ((occupy & 3940649673949184ull) == 0) result |= 4503599627370496ull;
if ((occupy & 8444249301319680ull) == 0) result |= 9007199254740992ull;
if ((occupy & 17451448556060672ull) == 0) result |= 18014398509481984ull;
if ((occupy & 35465847065542656ull) == 0) result |= 36028797018963968ull;
return result;
case 49:
result = 1407374883553280ull;
if ((occupy & 1125899906842624ull) == 0) result |= 2251799813685248ull;
if ((occupy & 3377699720527872ull) == 0) result |= 4503599627370496ull;
if ((occupy & 7881299347898368ull) == 0) result |= 9007199254740992ull;
if ((occupy & 16888498602639360ull) == 0) result |= 18014398509481984ull;
if ((occupy & 34902897112121344ull) == 0) result |= 36028797018963968ull;
return result;
case 50:
result = 2814749767106560ull;
if ((occupy & 562949953421312ull) == 0) result |= 281474976710656ull;
if ((occupy & 2251799813685248ull) == 0) result |= 4503599627370496ull;
if ((occupy & 6755399441055744ull) == 0) result |= 9007199254740992ull;
if ((occupy & 15762598695796736ull) == 0) result |= 18014398509481984ull;
if ((occupy & 33776997205278720ull) == 0) result |= 36028797018963968ull;
return result;
case 51:
result = 5629499534213120ull;
if ((occupy & 1125899906842624ull) == 0) result |= 562949953421312ull;
if ((occupy & 1688849860263936ull) == 0) result |= 281474976710656ull;
if ((occupy & 4503599627370496ull) == 0) result |= 9007199254740992ull;
if ((occupy & 13510798882111488ull) == 0) result |= 18014398509481984ull;
if ((occupy & 31525197391593472ull) == 0) result |= 36028797018963968ull;
return result;
case 52:
result = 11258999068426240ull;
if ((occupy & 2251799813685248ull) == 0) result |= 1125899906842624ull;
if ((occupy & 3377699720527872ull) == 0) result |= 562949953421312ull;
if ((occupy & 3940649673949184ull) == 0) result |= 281474976710656ull;
if ((occupy & 9007199254740992ull) == 0) result |= 18014398509481984ull;
if ((occupy & 27021597764222976ull) == 0) result |= 36028797018963968ull;
return result;
case 53:
result = 22517998136852480ull;
if ((occupy & 4503599627370496ull) == 0) result |= 2251799813685248ull;
if ((occupy & 6755399441055744ull) == 0) result |= 1125899906842624ull;
if ((occupy & 7881299347898368ull) == 0) result |= 562949953421312ull;
if ((occupy & 8444249301319680ull) == 0) result |= 281474976710656ull;
if ((occupy & 18014398509481984ull) == 0) result |= 36028797018963968ull;
return result;
case 54:
result = 45035996273704960ull;
if ((occupy & 9007199254740992ull) == 0) result |= 4503599627370496ull;
if ((occupy & 13510798882111488ull) == 0) result |= 2251799813685248ull;
if ((occupy & 15762598695796736ull) == 0) result |= 1125899906842624ull;
if ((occupy & 16888498602639360ull) == 0) result |= 562949953421312ull;
if ((occupy & 17451448556060672ull) == 0) result |= 281474976710656ull;
return result;
case 55:
result = 18014398509481984ull;
if ((occupy & 18014398509481984ull) == 0) result |= 9007199254740992ull;
if ((occupy & 27021597764222976ull) == 0) result |= 4503599627370496ull;
if ((occupy & 31525197391593472ull) == 0) result |= 2251799813685248ull;
if ((occupy & 33776997205278720ull) == 0) result |= 1125899906842624ull;
if ((occupy & 34902897112121344ull) == 0) result |= 562949953421312ull;
if ((occupy & 35465847065542656ull) == 0) result |= 281474976710656ull;
return result;
case 56:
result = 144115188075855872ull;
if ((occupy & 144115188075855872ull) == 0) result |= 288230376151711744ull;
if ((occupy & 432345564227567616ull) == 0) result |= 576460752303423488ull;
if ((occupy & 1008806316530991104ull) == 0) result |= 1152921504606846976ull;
if ((occupy & 2161727821137838080ull) == 0) result |= 2305843009213693952ull;
if ((occupy & 4467570830351532032ull) == 0) result |= 4611686018427387904ull;
if ((occupy & 9079256848778919936ull) == 0) result |= 9223372036854775808ull;
return result;
case 57:
result = 360287970189639680ull;
if ((occupy & 288230376151711744ull) == 0) result |= 576460752303423488ull;
if ((occupy & 864691128455135232ull) == 0) result |= 1152921504606846976ull;
if ((occupy & 2017612633061982208ull) == 0) result |= 2305843009213693952ull;
if ((occupy & 4323455642275676160ull) == 0) result |= 4611686018427387904ull;
if ((occupy & 8935141660703064064ull) == 0) result |= 9223372036854775808ull;
return result;
case 58:
result = 720575940379279360ull;
if ((occupy & 144115188075855872ull) == 0) result |= 72057594037927936ull;
if ((occupy & 576460752303423488ull) == 0) result |= 1152921504606846976ull;
if ((occupy & 1729382256910270464ull) == 0) result |= 2305843009213693952ull;
if ((occupy & 4035225266123964416ull) == 0) result |= 4611686018427387904ull;
if ((occupy & 8646911284551352320ull) == 0) result |= 9223372036854775808ull;
return result;
case 59:
result = 1441151880758558720ull;
if ((occupy & 288230376151711744ull) == 0) result |= 144115188075855872ull;
if ((occupy & 432345564227567616ull) == 0) result |= 72057594037927936ull;
if ((occupy & 1152921504606846976ull) == 0) result |= 2305843009213693952ull;
if ((occupy & 3458764513820540928ull) == 0) result |= 4611686018427387904ull;
if ((occupy & 8070450532247928832ull) == 0) result |= 9223372036854775808ull;
return result;
case 60:
result = 2882303761517117440ull;
if ((occupy & 576460752303423488ull) == 0) result |= 288230376151711744ull;
if ((occupy & 864691128455135232ull) == 0) result |= 144115188075855872ull;
if ((occupy & 1008806316530991104ull) == 0) result |= 72057594037927936ull;
if ((occupy & 2305843009213693952ull) == 0) result |= 4611686018427387904ull;
if ((occupy & 6917529027641081856ull) == 0) result |= 9223372036854775808ull;
return result;
case 61:
result = 5764607523034234880ull;
if ((occupy & 1152921504606846976ull) == 0) result |= 576460752303423488ull;
if ((occupy & 1729382256910270464ull) == 0) result |= 288230376151711744ull;
if ((occupy & 2017612633061982208ull) == 0) result |= 144115188075855872ull;
if ((occupy & 2161727821137838080ull) == 0) result |= 72057594037927936ull;
if ((occupy & 4611686018427387904ull) == 0) result |= 9223372036854775808ull;
return result;
case 62:
result = 11529215046068469760ull;
if ((occupy & 2305843009213693952ull) == 0) result |= 1152921504606846976ull;
if ((occupy & 3458764513820540928ull) == 0) result |= 576460752303423488ull;
if ((occupy & 4035225266123964416ull) == 0) result |= 288230376151711744ull;
if ((occupy & 4323455642275676160ull) == 0) result |= 144115188075855872ull;
if ((occupy & 4467570830351532032ull) == 0) result |= 72057594037927936ull;
return result;
case 63:
result = 4611686018427387904ull;
if ((occupy & 4611686018427387904ull) == 0) result |= 2305843009213693952ull;
if ((occupy & 6917529027641081856ull) == 0) result |= 1152921504606846976ull;
if ((occupy & 8070450532247928832ull) == 0) result |= 576460752303423488ull;
if ((occupy & 8646911284551352320ull) == 0) result |= 288230376151711744ull;
if ((occupy & 8935141660703064064ull) == 0) result |= 144115188075855872ull;
if ((occupy & 9079256848778919936ull) == 0) result |= 72057594037927936ull;
return result;
}
return 0;
}
static constexpr uint64_t GetSliderVCond(uint64_t SliderSquare, uint64_t occupy) {
uint64_t result{};
switch (SliderSquare) {
case 0:
result = 256ull;
if ((occupy & 256ull) == 0) result |= 65536ull;
if ((occupy & 65792ull) == 0) result |= 16777216ull;
if ((occupy & 16843008ull) == 0) result |= 4294967296ull;
if ((occupy & 4311810304ull) == 0) result |= 1099511627776ull;
if ((occupy & 1103823438080ull) == 0) result |= 281474976710656ull;
if ((occupy & 282578800148736ull) == 0) result |= 72057594037927936ull;
return result;
case 1:
result = 512ull;
if ((occupy & 512ull) == 0) result |= 131072ull;
if ((occupy & 131584ull) == 0) result |= 33554432ull;
if ((occupy & 33686016ull) == 0) result |= 8589934592ull;
if ((occupy & 8623620608ull) == 0) result |= 2199023255552ull;
if ((occupy & 2207646876160ull) == 0) result |= 562949953421312ull;
if ((occupy & 565157600297472ull) == 0) result |= 144115188075855872ull;
return result;
case 2:
result = 1024ull;
if ((occupy & 1024ull) == 0) result |= 262144ull;
if ((occupy & 263168ull) == 0) result |= 67108864ull;
if ((occupy & 67372032ull) == 0) result |= 17179869184ull;
if ((occupy & 17247241216ull) == 0) result |= 4398046511104ull;
if ((occupy & 4415293752320ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1130315200594944ull) == 0) result |= 288230376151711744ull;
return result;
case 3:
result = 2048ull;
if ((occupy & 2048ull) == 0) result |= 524288ull;
if ((occupy & 526336ull) == 0) result |= 134217728ull;
if ((occupy & 134744064ull) == 0) result |= 34359738368ull;
if ((occupy & 34494482432ull) == 0) result |= 8796093022208ull;
if ((occupy & 8830587504640ull) == 0) result |= 2251799813685248ull;
if ((occupy & 2260630401189888ull) == 0) result |= 576460752303423488ull;
return result;
case 4:
result = 4096ull;
if ((occupy & 4096ull) == 0) result |= 1048576ull;
if ((occupy & 1052672ull) == 0) result |= 268435456ull;
if ((occupy & 269488128ull) == 0) result |= 68719476736ull;
if ((occupy & 68988964864ull) == 0) result |= 17592186044416ull;
if ((occupy & 17661175009280ull) == 0) result |= 4503599627370496ull;
if ((occupy & 4521260802379776ull) == 0) result |= 1152921504606846976ull;
return result;
case 5:
result = 8192ull;
if ((occupy & 8192ull) == 0) result |= 2097152ull;
if ((occupy & 2105344ull) == 0) result |= 536870912ull;
if ((occupy & 538976256ull) == 0) result |= 137438953472ull;
if ((occupy & 137977929728ull) == 0) result |= 35184372088832ull;
if ((occupy & 35322350018560ull) == 0) result |= 9007199254740992ull;
if ((occupy & 9042521604759552ull) == 0) result |= 2305843009213693952ull;
return result;
case 6:
result = 16384ull;
if ((occupy & 16384ull) == 0) result |= 4194304ull;
if ((occupy & 4210688ull) == 0) result |= 1073741824ull;
if ((occupy & 1077952512ull) == 0) result |= 274877906944ull;
if ((occupy & 275955859456ull) == 0) result |= 70368744177664ull;
if ((occupy & 70644700037120ull) == 0) result |= 18014398509481984ull;
if ((occupy & 18085043209519104ull) == 0) result |= 4611686018427387904ull;
return result;
case 7:
result = 32768ull;
if ((occupy & 32768ull) == 0) result |= 8388608ull;
if ((occupy & 8421376ull) == 0) result |= 2147483648ull;
if ((occupy & 2155905024ull) == 0) result |= 549755813888ull;
if ((occupy & 551911718912ull) == 0) result |= 140737488355328ull;
if ((occupy & 141289400074240ull) == 0) result |= 36028797018963968ull;
if ((occupy & 36170086419038208ull) == 0) result |= 9223372036854775808ull;
return result;
case 8:
result = 65537ull;
if ((occupy & 65536ull) == 0) result |= 16777216ull;
if ((occupy & 16842752ull) == 0) result |= 4294967296ull;
if ((occupy & 4311810048ull) == 0) result |= 1099511627776ull;
if ((occupy & 1103823437824ull) == 0) result |= 281474976710656ull;
if ((occupy & 282578800148480ull) == 0) result |= 72057594037927936ull;
return result;
case 9:
result = 131074ull;
if ((occupy & 131072ull) == 0) result |= 33554432ull;
if ((occupy & 33685504ull) == 0) result |= 8589934592ull;
if ((occupy & 8623620096ull) == 0) result |= 2199023255552ull;
if ((occupy & 2207646875648ull) == 0) result |= 562949953421312ull;
if ((occupy & 565157600296960ull) == 0) result |= 144115188075855872ull;
return result;
case 10:
result = 262148ull;
if ((occupy & 262144ull) == 0) result |= 67108864ull;
if ((occupy & 67371008ull) == 0) result |= 17179869184ull;
if ((occupy & 17247240192ull) == 0) result |= 4398046511104ull;
if ((occupy & 4415293751296ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1130315200593920ull) == 0) result |= 288230376151711744ull;
return result;
case 11:
result = 524296ull;
if ((occupy & 524288ull) == 0) result |= 134217728ull;
if ((occupy & 134742016ull) == 0) result |= 34359738368ull;
if ((occupy & 34494480384ull) == 0) result |= 8796093022208ull;
if ((occupy & 8830587502592ull) == 0) result |= 2251799813685248ull;
if ((occupy & 2260630401187840ull) == 0) result |= 576460752303423488ull;
return result;
case 12:
result = 1048592ull;
if ((occupy & 1048576ull) == 0) result |= 268435456ull;
if ((occupy & 269484032ull) == 0) result |= 68719476736ull;
if ((occupy & 68988960768ull) == 0) result |= 17592186044416ull;
if ((occupy & 17661175005184ull) == 0) result |= 4503599627370496ull;
if ((occupy & 4521260802375680ull) == 0) result |= 1152921504606846976ull;
return result;
case 13:
result = 2097184ull;
if ((occupy & 2097152ull) == 0) result |= 536870912ull;
if ((occupy & 538968064ull) == 0) result |= 137438953472ull;
if ((occupy & 137977921536ull) == 0) result |= 35184372088832ull;
if ((occupy & 35322350010368ull) == 0) result |= 9007199254740992ull;
if ((occupy & 9042521604751360ull) == 0) result |= 2305843009213693952ull;
return result;
case 14:
result = 4194368ull;
if ((occupy & 4194304ull) == 0) result |= 1073741824ull;
if ((occupy & 1077936128ull) == 0) result |= 274877906944ull;
if ((occupy & 275955843072ull) == 0) result |= 70368744177664ull;
if ((occupy & 70644700020736ull) == 0) result |= 18014398509481984ull;
if ((occupy & 18085043209502720ull) == 0) result |= 4611686018427387904ull;
return result;
case 15:
result = 8388736ull;
if ((occupy & 8388608ull) == 0) result |= 2147483648ull;
if ((occupy & 2155872256ull) == 0) result |= 549755813888ull;
if ((occupy & 551911686144ull) == 0) result |= 140737488355328ull;
if ((occupy & 141289400041472ull) == 0) result |= 36028797018963968ull;
if ((occupy & 36170086419005440ull) == 0) result |= 9223372036854775808ull;
return result;
case 16:
result = 16777472ull;
if ((occupy & 256ull) == 0) result |= 1ull;
if ((occupy & 16777216ull) == 0) result |= 4294967296ull;
if ((occupy & 4311744512ull) == 0) result |= 1099511627776ull;
if ((occupy & 1103823372288ull) == 0) result |= 281474976710656ull;
if ((occupy & 282578800082944ull) == 0) result |= 72057594037927936ull;
return result;
case 17:
result = 33554944ull;
if ((occupy & 512ull) == 0) result |= 2ull;
if ((occupy & 33554432ull) == 0) result |= 8589934592ull;
if ((occupy & 8623489024ull) == 0) result |= 2199023255552ull;
if ((occupy & 2207646744576ull) == 0) result |= 562949953421312ull;
if ((occupy & 565157600165888ull) == 0) result |= 144115188075855872ull;
return result;
case 18:
result = 67109888ull;
if ((occupy & 1024ull) == 0) result |= 4ull;
if ((occupy & 67108864ull) == 0) result |= 17179869184ull;
if ((occupy & 17246978048ull) == 0) result |= 4398046511104ull;
if ((occupy & 4415293489152ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1130315200331776ull) == 0) result |= 288230376151711744ull;
return result;
case 19:
result = 134219776ull;
if ((occupy & 2048ull) == 0) result |= 8ull;
if ((occupy & 134217728ull) == 0) result |= 34359738368ull;
if ((occupy & 34493956096ull) == 0) result |= 8796093022208ull;
if ((occupy & 8830586978304ull) == 0) result |= 2251799813685248ull;
if ((occupy & 2260630400663552ull) == 0) result |= 576460752303423488ull;
return result;
case 20:
result = 268439552ull;
if ((occupy & 4096ull) == 0) result |= 16ull;
if ((occupy & 268435456ull) == 0) result |= 68719476736ull;
if ((occupy & 68987912192ull) == 0) result |= 17592186044416ull;
if ((occupy & 17661173956608ull) == 0) result |= 4503599627370496ull;
if ((occupy & 4521260801327104ull) == 0) result |= 1152921504606846976ull;
return result;
case 21:
result = 536879104ull;
if ((occupy & 8192ull) == 0) result |= 32ull;
if ((occupy & 536870912ull) == 0) result |= 137438953472ull;
if ((occupy & 137975824384ull) == 0) result |= 35184372088832ull;
if ((occupy & 35322347913216ull) == 0) result |= 9007199254740992ull;
if ((occupy & 9042521602654208ull) == 0) result |= 2305843009213693952ull;
return result;
case 22:
result = 1073758208ull;
if ((occupy & 16384ull) == 0) result |= 64ull;
if ((occupy & 1073741824ull) == 0) result |= 274877906944ull;
if ((occupy & 275951648768ull) == 0) result |= 70368744177664ull;
if ((occupy & 70644695826432ull) == 0) result |= 18014398509481984ull;
if ((occupy & 18085043205308416ull) == 0) result |= 4611686018427387904ull;
return result;
case 23:
result = 2147516416ull;
if ((occupy & 32768ull) == 0) result |= 128ull;
if ((occupy & 2147483648ull) == 0) result |= 549755813888ull;
if ((occupy & 551903297536ull) == 0) result |= 140737488355328ull;
if ((occupy & 141289391652864ull) == 0) result |= 36028797018963968ull;
if ((occupy & 36170086410616832ull) == 0) result |= 9223372036854775808ull;
return result;
case 24:
result = 4295032832ull;
if ((occupy & 65536ull) == 0) result |= 256ull;
if ((occupy & 65792ull) == 0) result |= 1ull;
if ((occupy & 4294967296ull) == 0) result |= 1099511627776ull;
if ((occupy & 1103806595072ull) == 0) result |= 281474976710656ull;
if ((occupy & 282578783305728ull) == 0) result |= 72057594037927936ull;
return result;
case 25:
result = 8590065664ull;
if ((occupy & 131072ull) == 0) result |= 512ull;
if ((occupy & 131584ull) == 0) result |= 2ull;
if ((occupy & 8589934592ull) == 0) result |= 2199023255552ull;
if ((occupy & 2207613190144ull) == 0) result |= 562949953421312ull;
if ((occupy & 565157566611456ull) == 0) result |= 144115188075855872ull;
return result;
case 26:
result = 17180131328ull;
if ((occupy & 262144ull) == 0) result |= 1024ull;
if ((occupy & 263168ull) == 0) result |= 4ull;
if ((occupy & 17179869184ull) == 0) result |= 4398046511104ull;
if ((occupy & 4415226380288ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1130315133222912ull) == 0) result |= 288230376151711744ull;
return result;
case 27:
result = 34360262656ull;
if ((occupy & 524288ull) == 0) result |= 2048ull;
if ((occupy & 526336ull) == 0) result |= 8ull;
if ((occupy & 34359738368ull) == 0) result |= 8796093022208ull;
if ((occupy & 8830452760576ull) == 0) result |= 2251799813685248ull;
if ((occupy & 2260630266445824ull) == 0) result |= 576460752303423488ull;
return result;
case 28:
result = 68720525312ull;
if ((occupy & 1048576ull) == 0) result |= 4096ull;
if ((occupy & 1052672ull) == 0) result |= 16ull;
if ((occupy & 68719476736ull) == 0) result |= 17592186044416ull;
if ((occupy & 17660905521152ull) == 0) result |= 4503599627370496ull;
if ((occupy & 4521260532891648ull) == 0) result |= 1152921504606846976ull;
return result;
case 29:
result = 137441050624ull;
if ((occupy & 2097152ull) == 0) result |= 8192ull;
if ((occupy & 2105344ull) == 0) result |= 32ull;
if ((occupy & 137438953472ull) == 0) result |= 35184372088832ull;
if ((occupy & 35321811042304ull) == 0) result |= 9007199254740992ull;
if ((occupy & 9042521065783296ull) == 0) result |= 2305843009213693952ull;
return result;
case 30:
result = 274882101248ull;
if ((occupy & 4194304ull) == 0) result |= 16384ull;
if ((occupy & 4210688ull) == 0) result |= 64ull;
if ((occupy & 274877906944ull) == 0) result |= 70368744177664ull;
if ((occupy & 70643622084608ull) == 0) result |= 18014398509481984ull;
if ((occupy & 18085042131566592ull) == 0) result |= 4611686018427387904ull;
return result;
case 31:
result = 549764202496ull;
if ((occupy & 8388608ull) == 0) result |= 32768ull;
if ((occupy & 8421376ull) == 0) result |= 128ull;
if ((occupy & 549755813888ull) == 0) result |= 140737488355328ull;
if ((occupy & 141287244169216ull) == 0) result |= 36028797018963968ull;
if ((occupy & 36170084263133184ull) == 0) result |= 9223372036854775808ull;
return result;
case 32:
result = 1099528404992ull;
if ((occupy & 16777216ull) == 0) result |= 65536ull;
if ((occupy & 16842752ull) == 0) result |= 256ull;
if ((occupy & 16843008ull) == 0) result |= 1ull;
if ((occupy & 1099511627776ull) == 0) result |= 281474976710656ull;
if ((occupy & 282574488338432ull) == 0) result |= 72057594037927936ull;
return result;
case 33:
result = 2199056809984ull;
if ((occupy & 33554432ull) == 0) result |= 131072ull;
if ((occupy & 33685504ull) == 0) result |= 512ull;
if ((occupy & 33686016ull) == 0) result |= 2ull;
if ((occupy & 2199023255552ull) == 0) result |= 562949953421312ull;
if ((occupy & 565148976676864ull) == 0) result |= 144115188075855872ull;
return result;
case 34:
result = 4398113619968ull;
if ((occupy & 67108864ull) == 0) result |= 262144ull;
if ((occupy & 67371008ull) == 0) result |= 1024ull;
if ((occupy & 67372032ull) == 0) result |= 4ull;
if ((occupy & 4398046511104ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1130297953353728ull) == 0) result |= 288230376151711744ull;
return result;
case 35:
result = 8796227239936ull;
if ((occupy & 134217728ull) == 0) result |= 524288ull;
if ((occupy & 134742016ull) == 0) result |= 2048ull;
if ((occupy & 134744064ull) == 0) result |= 8ull;
if ((occupy & 8796093022208ull) == 0) result |= 2251799813685248ull;
if ((occupy & 2260595906707456ull) == 0) result |= 576460752303423488ull;
return result;
case 36:
result = 17592454479872ull;
if ((occupy & 268435456ull) == 0) result |= 1048576ull;
if ((occupy & 269484032ull) == 0) result |= 4096ull;
if ((occupy & 269488128ull) == 0) result |= 16ull;
if ((occupy & 17592186044416ull) == 0) result |= 4503599627370496ull;
if ((occupy & 4521191813414912ull) == 0) result |= 1152921504606846976ull;
return result;
case 37:
result = 35184908959744ull;
if ((occupy & 536870912ull) == 0) result |= 2097152ull;
if ((occupy & 538968064ull) == 0) result |= 8192ull;
if ((occupy & 538976256ull) == 0) result |= 32ull;
if ((occupy & 35184372088832ull) == 0) result |= 9007199254740992ull;
if ((occupy & 9042383626829824ull) == 0) result |= 2305843009213693952ull;
return result;
case 38:
result = 70369817919488ull;
if ((occupy & 1073741824ull) == 0) result |= 4194304ull;
if ((occupy & 1077936128ull) == 0) result |= 16384ull;
if ((occupy & 1077952512ull) == 0) result |= 64ull;
if ((occupy & 70368744177664ull) == 0) result |= 18014398509481984ull;
if ((occupy & 18084767253659648ull) == 0) result |= 4611686018427387904ull;
return result;
case 39:
result = 140739635838976ull;
if ((occupy & 2147483648ull) == 0) result |= 8388608ull;
if ((occupy & 2155872256ull) == 0) result |= 32768ull;
if ((occupy & 2155905024ull) == 0) result |= 128ull;
if ((occupy & 140737488355328ull) == 0) result |= 36028797018963968ull;
if ((occupy & 36169534507319296ull) == 0) result |= 9223372036854775808ull;
return result;
case 40:
result = 281479271677952ull;
if ((occupy & 4294967296ull) == 0) result |= 16777216ull;
if ((occupy & 4311744512ull) == 0) result |= 65536ull;
if ((occupy & 4311810048ull) == 0) result |= 256ull;
if ((occupy & 4311810304ull) == 0) result |= 1ull;
if ((occupy & 281474976710656ull) == 0) result |= 72057594037927936ull;
return result;
case 41:
result = 562958543355904ull;
if ((occupy & 8589934592ull) == 0) result |= 33554432ull;
if ((occupy & 8623489024ull) == 0) result |= 131072ull;
if ((occupy & 8623620096ull) == 0) result |= 512ull;
if ((occupy & 8623620608ull) == 0) result |= 2ull;
if ((occupy & 562949953421312ull) == 0) result |= 144115188075855872ull;
return result;
case 42:
result = 1125917086711808ull;
if ((occupy & 17179869184ull) == 0) result |= 67108864ull;
if ((occupy & 17246978048ull) == 0) result |= 262144ull;
if ((occupy & 17247240192ull) == 0) result |= 1024ull;
if ((occupy & 17247241216ull) == 0) result |= 4ull;
if ((occupy & 1125899906842624ull) == 0) result |= 288230376151711744ull;
return result;
case 43:
result = 2251834173423616ull;
if ((occupy & 34359738368ull) == 0) result |= 134217728ull;
if ((occupy & 34493956096ull) == 0) result |= 524288ull;
if ((occupy & 34494480384ull) == 0) result |= 2048ull;
if ((occupy & 34494482432ull) == 0) result |= 8ull;
if ((occupy & 2251799813685248ull) == 0) result |= 576460752303423488ull;
return result;
case 44:
result = 4503668346847232ull;
if ((occupy & 68719476736ull) == 0) result |= 268435456ull;
if ((occupy & 68987912192ull) == 0) result |= 1048576ull;
if ((occupy & 68988960768ull) == 0) result |= 4096ull;
if ((occupy & 68988964864ull) == 0) result |= 16ull;
if ((occupy & 4503599627370496ull) == 0) result |= 1152921504606846976ull;
return result;
case 45:
result = 9007336693694464ull;
if ((occupy & 137438953472ull) == 0) result |= 536870912ull;
if ((occupy & 137975824384ull) == 0) result |= 2097152ull;
if ((occupy & 137977921536ull) == 0) result |= 8192ull;
if ((occupy & 137977929728ull) == 0) result |= 32ull;
if ((occupy & 9007199254740992ull) == 0) result |= 2305843009213693952ull;
return result;
case 46:
result = 18014673387388928ull;
if ((occupy & 274877906944ull) == 0) result |= 1073741824ull;
if ((occupy & 275951648768ull) == 0) result |= 4194304ull;
if ((occupy & 275955843072ull) == 0) result |= 16384ull;
if ((occupy & 275955859456ull) == 0) result |= 64ull;
if ((occupy & 18014398509481984ull) == 0) result |= 4611686018427387904ull;
return result;
case 47:
result = 36029346774777856ull;
if ((occupy & 549755813888ull) == 0) result |= 2147483648ull;
if ((occupy & 551903297536ull) == 0) result |= 8388608ull;
if ((occupy & 551911686144ull) == 0) result |= 32768ull;
if ((occupy & 551911718912ull) == 0) result |= 128ull;
if ((occupy & 36028797018963968ull) == 0) result |= 9223372036854775808ull;
return result;
case 48:
result = 72058693549555712ull;
if ((occupy & 1099511627776ull) == 0) result |= 4294967296ull;
if ((occupy & 1103806595072ull) == 0) result |= 16777216ull;
if ((occupy & 1103823372288ull) == 0) result |= 65536ull;
if ((occupy & 1103823437824ull) == 0) result |= 256ull;
if ((occupy & 1103823438080ull) == 0) result |= 1ull;
return result;
case 49:
result = 144117387099111424ull;
if ((occupy & 2199023255552ull) == 0) result |= 8589934592ull;
if ((occupy & 2207613190144ull) == 0) result |= 33554432ull;
if ((occupy & 2207646744576ull) == 0) result |= 131072ull;
if ((occupy & 2207646875648ull) == 0) result |= 512ull;
if ((occupy & 2207646876160ull) == 0) result |= 2ull;
return result;
case 50:
result = 288234774198222848ull;
if ((occupy & 4398046511104ull) == 0) result |= 17179869184ull;
if ((occupy & 4415226380288ull) == 0) result |= 67108864ull;
if ((occupy & 4415293489152ull) == 0) result |= 262144ull;
if ((occupy & 4415293751296ull) == 0) result |= 1024ull;
if ((occupy & 4415293752320ull) == 0) result |= 4ull;
return result;
case 51:
result = 576469548396445696ull;
if ((occupy & 8796093022208ull) == 0) result |= 34359738368ull;
if ((occupy & 8830452760576ull) == 0) result |= 134217728ull;
if ((occupy & 8830586978304ull) == 0) result |= 524288ull;
if ((occupy & 8830587502592ull) == 0) result |= 2048ull;
if ((occupy & 8830587504640ull) == 0) result |= 8ull;
return result;
case 52:
result = 1152939096792891392ull;
if ((occupy & 17592186044416ull) == 0) result |= 68719476736ull;
if ((occupy & 17660905521152ull) == 0) result |= 268435456ull;
if ((occupy & 17661173956608ull) == 0) result |= 1048576ull;
if ((occupy & 17661175005184ull) == 0) result |= 4096ull;
if ((occupy & 17661175009280ull) == 0) result |= 16ull;
return result;
case 53:
result = 2305878193585782784ull;
if ((occupy & 35184372088832ull) == 0) result |= 137438953472ull;
if ((occupy & 35321811042304ull) == 0) result |= 536870912ull;
if ((occupy & 35322347913216ull) == 0) result |= 2097152ull;
if ((occupy & 35322350010368ull) == 0) result |= 8192ull;
if ((occupy & 35322350018560ull) == 0) result |= 32ull;
return result;
case 54:
result = 4611756387171565568ull;
if ((occupy & 70368744177664ull) == 0) result |= 274877906944ull;
if ((occupy & 70643622084608ull) == 0) result |= 1073741824ull;
if ((occupy & 70644695826432ull) == 0) result |= 4194304ull;
if ((occupy & 70644700020736ull) == 0) result |= 16384ull;
if ((occupy & 70644700037120ull) == 0) result |= 64ull;
return result;
case 55:
result = 9223512774343131136ull;
if ((occupy & 140737488355328ull) == 0) result |= 549755813888ull;
if ((occupy & 141287244169216ull) == 0) result |= 2147483648ull;
if ((occupy & 141289391652864ull) == 0) result |= 8388608ull;
if ((occupy & 141289400041472ull) == 0) result |= 32768ull;
if ((occupy & 141289400074240ull) == 0) result |= 128ull;
return result;
case 56:
result = 281474976710656ull;
if ((occupy & 281474976710656ull) == 0) result |= 1099511627776ull;
if ((occupy & 282574488338432ull) == 0) result |= 4294967296ull;
if ((occupy & 282578783305728ull) == 0) result |= 16777216ull;
if ((occupy & 282578800082944ull) == 0) result |= 65536ull;
if ((occupy & 282578800148480ull) == 0) result |= 256ull;
if ((occupy & 282578800148736ull) == 0) result |= 1ull;
return result;
case 57:
result = 562949953421312ull;
if ((occupy & 562949953421312ull) == 0) result |= 2199023255552ull;
if ((occupy & 565148976676864ull) == 0) result |= 8589934592ull;
if ((occupy & 565157566611456ull) == 0) result |= 33554432ull;
if ((occupy & 565157600165888ull) == 0) result |= 131072ull;
if ((occupy & 565157600296960ull) == 0) result |= 512ull;
if ((occupy & 565157600297472ull) == 0) result |= 2ull;
return result;
case 58:
result = 1125899906842624ull;
if ((occupy & 1125899906842624ull) == 0) result |= 4398046511104ull;
if ((occupy & 1130297953353728ull) == 0) result |= 17179869184ull;
if ((occupy & 1130315133222912ull) == 0) result |= 67108864ull;
if ((occupy & 1130315200331776ull) == 0) result |= 262144ull;
if ((occupy & 1130315200593920ull) == 0) result |= 1024ull;
if ((occupy & 1130315200594944ull) == 0) result |= 4ull;
return result;
case 59:
result = 2251799813685248ull;
if ((occupy & 2251799813685248ull) == 0) result |= 8796093022208ull;
if ((occupy & 2260595906707456ull) == 0) result |= 34359738368ull;
if ((occupy & 2260630266445824ull) == 0) result |= 134217728ull;
if ((occupy & 2260630400663552ull) == 0) result |= 524288ull;
if ((occupy & 2260630401187840ull) == 0) result |= 2048ull;
if ((occupy & 2260630401189888ull) == 0) result |= 8ull;
return result;
case 60:
result = 4503599627370496ull;
if ((occupy & 4503599627370496ull) == 0) result |= 17592186044416ull;
if ((occupy & 4521191813414912ull) == 0) result |= 68719476736ull;
if ((occupy & 4521260532891648ull) == 0) result |= 268435456ull;
if ((occupy & 4521260801327104ull) == 0) result |= 1048576ull;
if ((occupy & 4521260802375680ull) == 0) result |= 4096ull;
if ((occupy & 4521260802379776ull) == 0) result |= 16ull;
return result;
case 61:
result = 9007199254740992ull;
if ((occupy & 9007199254740992ull) == 0) result |= 35184372088832ull;
if ((occupy & 9042383626829824ull) == 0) result |= 137438953472ull;
if ((occupy & 9042521065783296ull) == 0) result |= 536870912ull;
if ((occupy & 9042521602654208ull) == 0) result |= 2097152ull;
if ((occupy & 9042521604751360ull) == 0) result |= 8192ull;
if ((occupy & 9042521604759552ull) == 0) result |= 32ull;
return result;
case 62:
result = 18014398509481984ull;
if ((occupy & 18014398509481984ull) == 0) result |= 70368744177664ull;
if ((occupy & 18084767253659648ull) == 0) result |= 274877906944ull;
if ((occupy & 18085042131566592ull) == 0) result |= 1073741824ull;
if ((occupy & 18085043205308416ull) == 0) result |= 4194304ull;
if ((occupy & 18085043209502720ull) == 0) result |= 16384ull;
if ((occupy & 18085043209519104ull) == 0) result |= 64ull;
return result;
case 63:
result = 36028797018963968ull;
if ((occupy & 36028797018963968ull) == 0) result |= 140737488355328ull;
if ((occupy & 36169534507319296ull) == 0) result |= 549755813888ull;
if ((occupy & 36170084263133184ull) == 0) result |= 2147483648ull;
if ((occupy & 36170086410616832ull) == 0) result |= 8388608ull;
if ((occupy & 36170086419005440ull) == 0) result |= 32768ull;
if ((occupy & 36170086419038208ull) == 0) result |= 128ull;
return result;
}
return 0;
}
static constexpr uint64_t GetSliderD2Cond(uint64_t SliderSquare, uint64_t occupy) {
uint64_t result{};
switch (SliderSquare) {
case 0:
result = 0ull;
return result;
case 1:
result = 256ull;
return result;
case 2:
result = 512ull;
if ((occupy & 512ull) == 0) result |= 65536ull;
return result;
case 3:
result = 1024ull;
if ((occupy & 1024ull) == 0) result |= 131072ull;
if ((occupy & 132096ull) == 0) result |= 16777216ull;
return result;
case 4:
result = 2048ull;
if ((occupy & 2048ull) == 0) result |= 262144ull;
if ((occupy & 264192ull) == 0) result |= 33554432ull;
if ((occupy & 33818624ull) == 0) result |= 4294967296ull;
return result;
case 5:
result = 4096ull;
if ((occupy & 4096ull) == 0) result |= 524288ull;
if ((occupy & 528384ull) == 0) result |= 67108864ull;
if ((occupy & 67637248ull) == 0) result |= 8589934592ull;
if ((occupy & 8657571840ull) == 0) result |= 1099511627776ull;
return result;
case 6:
result = 8192ull;
if ((occupy & 8192ull) == 0) result |= 1048576ull;
if ((occupy & 1056768ull) == 0) result |= 134217728ull;
if ((occupy & 135274496ull) == 0) result |= 17179869184ull;
if ((occupy & 17315143680ull) == 0) result |= 2199023255552ull;
if ((occupy & 2216338399232ull) == 0) result |= 281474976710656ull;
return result;
case 7:
result = 16384ull;
if ((occupy & 16384ull) == 0) result |= 2097152ull;
if ((occupy & 2113536ull) == 0) result |= 268435456ull;
if ((occupy & 270548992ull) == 0) result |= 34359738368ull;
if ((occupy & 34630287360ull) == 0) result |= 4398046511104ull;
if ((occupy & 4432676798464ull) == 0) result |= 562949953421312ull;
if ((occupy & 567382630219776ull) == 0) result |= 72057594037927936ull;
return result;
case 8:
result = 2ull;
return result;
case 9:
result = 65540ull;
return result;
case 10:
result = 131080ull;
if ((occupy & 131072ull) == 0) result |= 16777216ull;
return result;
case 11:
result = 262160ull;
if ((occupy & 262144ull) == 0) result |= 33554432ull;
if ((occupy & 33816576ull) == 0) result |= 4294967296ull;
return result;
case 12:
result = 524320ull;
if ((occupy & 524288ull) == 0) result |= 67108864ull;
if ((occupy & 67633152ull) == 0) result |= 8589934592ull;
if ((occupy & 8657567744ull) == 0) result |= 1099511627776ull;
return result;
case 13:
result = 1048640ull;
if ((occupy & 1048576ull) == 0) result |= 134217728ull;
if ((occupy & 135266304ull) == 0) result |= 17179869184ull;
if ((occupy & 17315135488ull) == 0) result |= 2199023255552ull;
if ((occupy & 2216338391040ull) == 0) result |= 281474976710656ull;
return result;
case 14:
result = 2097280ull;
if ((occupy & 2097152ull) == 0) result |= 268435456ull;
if ((occupy & 270532608ull) == 0) result |= 34359738368ull;
if ((occupy & 34630270976ull) == 0) result |= 4398046511104ull;
if ((occupy & 4432676782080ull) == 0) result |= 562949953421312ull;
if ((occupy & 567382630203392ull) == 0) result |= 72057594037927936ull;
return result;
case 15:
result = 4194304ull;
if ((occupy & 4194304ull) == 0) result |= 536870912ull;
if ((occupy & 541065216ull) == 0) result |= 68719476736ull;
if ((occupy & 69260541952ull) == 0) result |= 8796093022208ull;
if ((occupy & 8865353564160ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1134765260406784ull) == 0) result |= 144115188075855872ull;
return result;
case 16:
result = 512ull;
if ((occupy & 512ull) == 0) result |= 4ull;
return result;
case 17:
result = 16778240ull;
if ((occupy & 1024ull) == 0) result |= 8ull;
return result;
case 18:
result = 33556480ull;
if ((occupy & 2048ull) == 0) result |= 16ull;
if ((occupy & 33554432ull) == 0) result |= 4294967296ull;
return result;
case 19:
result = 67112960ull;
if ((occupy & 4096ull) == 0) result |= 32ull;
if ((occupy & 67108864ull) == 0) result |= 8589934592ull;
if ((occupy & 8657043456ull) == 0) result |= 1099511627776ull;
return result;
case 20:
result = 134225920ull;
if ((occupy & 8192ull) == 0) result |= 64ull;
if ((occupy & 134217728ull) == 0) result |= 17179869184ull;
if ((occupy & 17314086912ull) == 0) result |= 2199023255552ull;
if ((occupy & 2216337342464ull) == 0) result |= 281474976710656ull;
return result;
case 21:
result = 268451840ull;
if ((occupy & 16384ull) == 0) result |= 128ull;
if ((occupy & 268435456ull) == 0) result |= 34359738368ull;
if ((occupy & 34628173824ull) == 0) result |= 4398046511104ull;
if ((occupy & 4432674684928ull) == 0) result |= 562949953421312ull;
if ((occupy & 567382628106240ull) == 0) result |= 72057594037927936ull;
return result;
case 22:
result = 536903680ull;
if ((occupy & 536870912ull) == 0) result |= 68719476736ull;
if ((occupy & 69256347648ull) == 0) result |= 8796093022208ull;
if ((occupy & 8865349369856ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1134765256212480ull) == 0) result |= 144115188075855872ull;
return result;
case 23:
result = 1073741824ull;
if ((occupy & 1073741824ull) == 0) result |= 137438953472ull;
if ((occupy & 138512695296ull) == 0) result |= 17592186044416ull;
if ((occupy & 17730698739712ull) == 0) result |= 2251799813685248ull;
if ((occupy & 2269530512424960ull) == 0) result |= 288230376151711744ull;
return result;
case 24:
result = 131072ull;
if ((occupy & 131072ull) == 0) result |= 1024ull;
if ((occupy & 132096ull) == 0) result |= 8ull;
return result;
case 25:
result = 4295229440ull;
if ((occupy & 262144ull) == 0) result |= 2048ull;
if ((occupy & 264192ull) == 0) result |= 16ull;
return result;
case 26:
result = 8590458880ull;
if ((occupy & 524288ull) == 0) result |= 4096ull;
if ((occupy & 528384ull) == 0) result |= 32ull;
if ((occupy & 8589934592ull) == 0) result |= 1099511627776ull;
return result;
case 27:
result = 17180917760ull;
if ((occupy & 1048576ull) == 0) result |= 8192ull;
if ((occupy & 1056768ull) == 0) result |= 64ull;
if ((occupy & 17179869184ull) == 0) result |= 2199023255552ull;
if ((occupy & 2216203124736ull) == 0) result |= 281474976710656ull;
return result;
case 28:
result = 34361835520ull;
if ((occupy & 2097152ull) == 0) result |= 16384ull;
if ((occupy & 2113536ull) == 0) result |= 128ull;
if ((occupy & 34359738368ull) == 0) result |= 4398046511104ull;
if ((occupy & 4432406249472ull) == 0) result |= 562949953421312ull;
if ((occupy & 567382359670784ull) == 0) result |= 72057594037927936ull;
return result;
case 29:
result = 68723671040ull;
if ((occupy & 4194304ull) == 0) result |= 32768ull;
if ((occupy & 68719476736ull) == 0) result |= 8796093022208ull;
if ((occupy & 8864812498944ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1134764719341568ull) == 0) result |= 144115188075855872ull;
return result;
case 30:
result = 137447342080ull;
if ((occupy & 137438953472ull) == 0) result |= 17592186044416ull;
if ((occupy & 17729624997888ull) == 0) result |= 2251799813685248ull;
if ((occupy & 2269529438683136ull) == 0) result |= 288230376151711744ull;
return result;
case 31:
result = 274877906944ull;
if ((occupy & 274877906944ull) == 0) result |= 35184372088832ull;
if ((occupy & 35459249995776ull) == 0) result |= 4503599627370496ull;
if ((occupy & 4539058877366272ull) == 0) result |= 576460752303423488ull;
return result;
case 32:
result = 33554432ull;
if ((occupy & 33554432ull) == 0) result |= 262144ull;
if ((occupy & 33816576ull) == 0) result |= 2048ull;
if ((occupy & 33818624ull) == 0) result |= 16ull;
return result;
case 33:
result = 1099578736640ull;
if ((occupy & 67108864ull) == 0) result |= 524288ull;
if ((occupy & 67633152ull) == 0) result |= 4096ull;
if ((occupy & 67637248ull) == 0) result |= 32ull;
return result;
case 34:
result = 2199157473280ull;
if ((occupy & 134217728ull) == 0) result |= 1048576ull;
if ((occupy & 135266304ull) == 0) result |= 8192ull;
if ((occupy & 135274496ull) == 0) result |= 64ull;
if ((occupy & 2199023255552ull) == 0) result |= 281474976710656ull;
return result;
case 35:
result = 4398314946560ull;
if ((occupy & 268435456ull) == 0) result |= 2097152ull;
if ((occupy & 270532608ull) == 0) result |= 16384ull;
if ((occupy & 270548992ull) == 0) result |= 128ull;
if ((occupy & 4398046511104ull) == 0) result |= 562949953421312ull;
if ((occupy & 567347999932416ull) == 0) result |= 72057594037927936ull;
return result;
case 36:
result = 8796629893120ull;
if ((occupy & 536870912ull) == 0) result |= 4194304ull;
if ((occupy & 541065216ull) == 0) result |= 32768ull;
if ((occupy & 8796093022208ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1134695999864832ull) == 0) result |= 144115188075855872ull;
return result;
case 37:
result = 17593259786240ull;
if ((occupy & 1073741824ull) == 0) result |= 8388608ull;
if ((occupy & 17592186044416ull) == 0) result |= 2251799813685248ull;
if ((occupy & 2269391999729664ull) == 0) result |= 288230376151711744ull;
return result;
case 38:
result = 35186519572480ull;
if ((occupy & 35184372088832ull) == 0) result |= 4503599627370496ull;
if ((occupy & 4538783999459328ull) == 0) result |= 576460752303423488ull;
return result;
case 39:
result = 70368744177664ull;
if ((occupy & 70368744177664ull) == 0) result |= 9007199254740992ull;
if ((occupy & 9077567998918656ull) == 0) result |= 1152921504606846976ull;
return result;
case 40:
result = 8589934592ull;
if ((occupy & 8589934592ull) == 0) result |= 67108864ull;
if ((occupy & 8657043456ull) == 0) result |= 524288ull;
if ((occupy & 8657567744ull) == 0) result |= 4096ull;
if ((occupy & 8657571840ull) == 0) result |= 32ull;
return result;
case 41:
result = 281492156579840ull;
if ((occupy & 17179869184ull) == 0) result |= 134217728ull;
if ((occupy & 17314086912ull) == 0) result |= 1048576ull;
if ((occupy & 17315135488ull) == 0) result |= 8192ull;
if ((occupy & 17315143680ull) == 0) result |= 64ull;
return result;
case 42:
result = 562984313159680ull;
if ((occupy & 34359738368ull) == 0) result |= 268435456ull;
if ((occupy & 34628173824ull) == 0) result |= 2097152ull;
if ((occupy & 34630270976ull) == 0) result |= 16384ull;
if ((occupy & 34630287360ull) == 0) result |= 128ull;
if ((occupy & 562949953421312ull) == 0) result |= 72057594037927936ull;
return result;
case 43:
result = 1125968626319360ull;
if ((occupy & 68719476736ull) == 0) result |= 536870912ull;
if ((occupy & 69256347648ull) == 0) result |= 4194304ull;
if ((occupy & 69260541952ull) == 0) result |= 32768ull;
if ((occupy & 1125899906842624ull) == 0) result |= 144115188075855872ull;
return result;
case 44:
result = 2251937252638720ull;
if ((occupy & 137438953472ull) == 0) result |= 1073741824ull;
if ((occupy & 138512695296ull) == 0) result |= 8388608ull;
if ((occupy & 2251799813685248ull) == 0) result |= 288230376151711744ull;
return result;
case 45:
result = 4503874505277440ull;
if ((occupy & 274877906944ull) == 0) result |= 2147483648ull;
if ((occupy & 4503599627370496ull) == 0) result |= 576460752303423488ull;
return result;
case 46:
result = 9007749010554880ull;
if ((occupy & 9007199254740992ull) == 0) result |= 1152921504606846976ull;
return result;
case 47:
result = 18014398509481984ull;
if ((occupy & 18014398509481984ull) == 0) result |= 2305843009213693952ull;
return result;
case 48:
result = 2199023255552ull;
if ((occupy & 2199023255552ull) == 0) result |= 17179869184ull;
if ((occupy & 2216203124736ull) == 0) result |= 134217728ull;
if ((occupy & 2216337342464ull) == 0) result |= 1048576ull;
if ((occupy & 2216338391040ull) == 0) result |= 8192ull;
if ((occupy & 2216338399232ull) == 0) result |= 64ull;
return result;
case 49:
result = 72061992084439040ull;
if ((occupy & 4398046511104ull) == 0) result |= 34359738368ull;
if ((occupy & 4432406249472ull) == 0) result |= 268435456ull;
if ((occupy & 4432674684928ull) == 0) result |= 2097152ull;
if ((occupy & 4432676782080ull) == 0) result |= 16384ull;
if ((occupy & 4432676798464ull) == 0) result |= 128ull;
return result;
case 50:
result = 144123984168878080ull;
if ((occupy & 8796093022208ull) == 0) result |= 68719476736ull;
if ((occupy & 8864812498944ull) == 0) result |= 536870912ull;
if ((occupy & 8865349369856ull) == 0) result |= 4194304ull;
if ((occupy & 8865353564160ull) == 0) result |= 32768ull;
return result;
case 51:
result = 288247968337756160ull;
if ((occupy & 17592186044416ull) == 0) result |= 137438953472ull;
if ((occupy & 17729624997888ull) == 0) result |= 1073741824ull;
if ((occupy & 17730698739712ull) == 0) result |= 8388608ull;
return result;
case 52:
result = 576495936675512320ull;
if ((occupy & 35184372088832ull) == 0) result |= 274877906944ull;
if ((occupy & 35459249995776ull) == 0) result |= 2147483648ull;
return result;
case 53:
result = 1152991873351024640ull;
if ((occupy & 70368744177664ull) == 0) result |= 549755813888ull;
return result;
case 54:
result = 2305983746702049280ull;
return result;
case 55:
result = 4611686018427387904ull;
return result;
case 56:
result = 562949953421312ull;
if ((occupy & 562949953421312ull) == 0) result |= 4398046511104ull;
if ((occupy & 567347999932416ull) == 0) result |= 34359738368ull;
if ((occupy & 567382359670784ull) == 0) result |= 268435456ull;
if ((occupy & 567382628106240ull) == 0) result |= 2097152ull;
if ((occupy & 567382630203392ull) == 0) result |= 16384ull;
if ((occupy & 567382630219776ull) == 0) result |= 128ull;
return result;
case 57:
result = 1125899906842624ull;
if ((occupy & 1125899906842624ull) == 0) result |= 8796093022208ull;
if ((occupy & 1134695999864832ull) == 0) result |= 68719476736ull;
if ((occupy & 1134764719341568ull) == 0) result |= 536870912ull;
if ((occupy & 1134765256212480ull) == 0) result |= 4194304ull;
if ((occupy & 1134765260406784ull) == 0) result |= 32768ull;
return result;
case 58:
result = 2251799813685248ull;
if ((occupy & 2251799813685248ull) == 0) result |= 17592186044416ull;
if ((occupy & 2269391999729664ull) == 0) result |= 137438953472ull;
if ((occupy & 2269529438683136ull) == 0) result |= 1073741824ull;
if ((occupy & 2269530512424960ull) == 0) result |= 8388608ull;
return result;
case 59:
result = 4503599627370496ull;
if ((occupy & 4503599627370496ull) == 0) result |= 35184372088832ull;
if ((occupy & 4538783999459328ull) == 0) result |= 274877906944ull;
if ((occupy & 4539058877366272ull) == 0) result |= 2147483648ull;
return result;
case 60:
result = 9007199254740992ull;
if ((occupy & 9007199254740992ull) == 0) result |= 70368744177664ull;
if ((occupy & 9077567998918656ull) == 0) result |= 549755813888ull;
return result;
case 61:
result = 18014398509481984ull;
if ((occupy & 18014398509481984ull) == 0) result |= 140737488355328ull;
return result;
case 62:
result = 36028797018963968ull;
return result;
case 63:
result = 0ull;
return result;
}
return 0;
}
static constexpr uint64_t GetSliderD1Cond(uint64_t SliderSquare, uint64_t occupy) {
uint64_t result{};
switch (SliderSquare) {
case 0:
result = 512ull;
if ((occupy & 512ull) == 0) result |= 262144ull;
if ((occupy & 262656ull) == 0) result |= 134217728ull;
if ((occupy & 134480384ull) == 0) result |= 68719476736ull;
if ((occupy & 68853957120ull) == 0) result |= 35184372088832ull;
if ((occupy & 35253226045952ull) == 0) result |= 18014398509481984ull;
if ((occupy & 18049651735527936ull) == 0) result |= 9223372036854775808ull;
return result;
case 1:
result = 1024ull;
if ((occupy & 1024ull) == 0) result |= 524288ull;
if ((occupy & 525312ull) == 0) result |= 268435456ull;
if ((occupy & 268960768ull) == 0) result |= 137438953472ull;
if ((occupy & 137707914240ull) == 0) result |= 70368744177664ull;
if ((occupy & 70506452091904ull) == 0) result |= 36028797018963968ull;
return result;
case 2:
result = 2048ull;
if ((occupy & 2048ull) == 0) result |= 1048576ull;
if ((occupy & 1050624ull) == 0) result |= 536870912ull;
if ((occupy & 537921536ull) == 0) result |= 274877906944ull;
if ((occupy & 275415828480ull) == 0) result |= 140737488355328ull;
return result;
case 3:
result = 4096ull;
if ((occupy & 4096ull) == 0) result |= 2097152ull;
if ((occupy & 2101248ull) == 0) result |= 1073741824ull;
if ((occupy & 1075843072ull) == 0) result |= 549755813888ull;
return result;
case 4:
result = 8192ull;
if ((occupy & 8192ull) == 0) result |= 4194304ull;
if ((occupy & 4202496ull) == 0) result |= 2147483648ull;
return result;
case 5:
result = 16384ull;
if ((occupy & 16384ull) == 0) result |= 8388608ull;
return result;
case 6:
result = 32768ull;
return result;
case 7:
result = 0ull;
return result;
case 8:
result = 131072ull;
if ((occupy & 131072ull) == 0) result |= 67108864ull;
if ((occupy & 67239936ull) == 0) result |= 34359738368ull;
if ((occupy & 34426978304ull) == 0) result |= 17592186044416ull;
if ((occupy & 17626613022720ull) == 0) result |= 9007199254740992ull;
if ((occupy & 9024825867763712ull) == 0) result |= 4611686018427387904ull;
return result;
case 9:
result = 262145ull;
if ((occupy & 262144ull) == 0) result |= 134217728ull;
if ((occupy & 134479872ull) == 0) result |= 68719476736ull;
if ((occupy & 68853956608ull) == 0) result |= 35184372088832ull;
if ((occupy & 35253226045440ull) == 0) result |= 18014398509481984ull;
if ((occupy & 18049651735527424ull) == 0) result |= 9223372036854775808ull;
return result;
case 10:
result = 524290ull;
if ((occupy & 524288ull) == 0) result |= 268435456ull;
if ((occupy & 268959744ull) == 0) result |= 137438953472ull;
if ((occupy & 137707913216ull) == 0) result |= 70368744177664ull;
if ((occupy & 70506452090880ull) == 0) result |= 36028797018963968ull;
return result;
case 11:
result = 1048580ull;
if ((occupy & 1048576ull) == 0) result |= 536870912ull;
if ((occupy & 537919488ull) == 0) result |= 274877906944ull;
if ((occupy & 275415826432ull) == 0) result |= 140737488355328ull;
return result;
case 12:
result = 2097160ull;
if ((occupy & 2097152ull) == 0) result |= 1073741824ull;
if ((occupy & 1075838976ull) == 0) result |= 549755813888ull;
return result;
case 13:
result = 4194320ull;
if ((occupy & 4194304ull) == 0) result |= 2147483648ull;
return result;
case 14:
result = 8388640ull;
return result;
case 15:
result = 64ull;
return result;
case 16:
result = 33554432ull;
if ((occupy & 33554432ull) == 0) result |= 17179869184ull;
if ((occupy & 17213423616ull) == 0) result |= 8796093022208ull;
if ((occupy & 8813306445824ull) == 0) result |= 4503599627370496ull;
if ((occupy & 4512412933816320ull) == 0) result |= 2305843009213693952ull;
return result;
case 17:
result = 67109120ull;
if ((occupy & 67108864ull) == 0) result |= 34359738368ull;
if ((occupy & 34426847232ull) == 0) result |= 17592186044416ull;
if ((occupy & 17626612891648ull) == 0) result |= 9007199254740992ull;
if ((occupy & 9024825867632640ull) == 0) result |= 4611686018427387904ull;
return result;
case 18:
result = 134218240ull;
if ((occupy & 512ull) == 0) result |= 1ull;
if ((occupy & 134217728ull) == 0) result |= 68719476736ull;
if ((occupy & 68853694464ull) == 0) result |= 35184372088832ull;
if ((occupy & 35253225783296ull) == 0) result |= 18014398509481984ull;
if ((occupy & 18049651735265280ull) == 0) result |= 9223372036854775808ull;
return result;
case 19:
result = 268436480ull;
if ((occupy & 1024ull) == 0) result |= 2ull;
if ((occupy & 268435456ull) == 0) result |= 137438953472ull;
if ((occupy & 137707388928ull) == 0) result |= 70368744177664ull;
if ((occupy & 70506451566592ull) == 0) result |= 36028797018963968ull;
return result;
case 20:
result = 536872960ull;
if ((occupy & 2048ull) == 0) result |= 4ull;
if ((occupy & 536870912ull) == 0) result |= 274877906944ull;
if ((occupy & 275414777856ull) == 0) result |= 140737488355328ull;
return result;
case 21:
result = 1073745920ull;
if ((occupy & 4096ull) == 0) result |= 8ull;
if ((occupy & 1073741824ull) == 0) result |= 549755813888ull;
return result;
case 22:
result = 2147491840ull;
if ((occupy & 8192ull) == 0) result |= 16ull;
return result;
case 23:
result = 16384ull;
if ((occupy & 16384ull) == 0) result |= 32ull;
return result;
case 24:
result = 8589934592ull;
if ((occupy & 8589934592ull) == 0) result |= 4398046511104ull;
if ((occupy & 4406636445696ull) == 0) result |= 2251799813685248ull;
if ((occupy & 2256206450130944ull) == 0) result |= 1152921504606846976ull;
return result;
case 25:
result = 17179934720ull;
if ((occupy & 17179869184ull) == 0) result |= 8796093022208ull;
if ((occupy & 8813272891392ull) == 0) result |= 4503599627370496ull;
if ((occupy & 4512412900261888ull) == 0) result |= 2305843009213693952ull;
return result;
case 26:
result = 34359869440ull;
if ((occupy & 131072ull) == 0) result |= 256ull;
if ((occupy & 34359738368ull) == 0) result |= 17592186044416ull;
if ((occupy & 17626545782784ull) == 0) result |= 9007199254740992ull;
if ((occupy & 9024825800523776ull) == 0) result |= 4611686018427387904ull;
return result;
case 27:
result = 68719738880ull;
if ((occupy & 262144ull) == 0) result |= 512ull;
if ((occupy & 262656ull) == 0) result |= 1ull;
if ((occupy & 68719476736ull) == 0) result |= 35184372088832ull;
if ((occupy & 35253091565568ull) == 0) result |= 18014398509481984ull;
if ((occupy & 18049651601047552ull) == 0) result |= 9223372036854775808ull;
return result;
case 28:
result = 137439477760ull;
if ((occupy & 524288ull) == 0) result |= 1024ull;
if ((occupy & 525312ull) == 0) result |= 2ull;
if ((occupy & 137438953472ull) == 0) result |= 70368744177664ull;
if ((occupy & 70506183131136ull) == 0) result |= 36028797018963968ull;
return result;
case 29:
result = 274878955520ull;
if ((occupy & 1048576ull) == 0) result |= 2048ull;
if ((occupy & 1050624ull) == 0) result |= 4ull;
if ((occupy & 274877906944ull) == 0) result |= 140737488355328ull;
return result;
case 30:
result = 549757911040ull;
if ((occupy & 2097152ull) == 0) result |= 4096ull;
if ((occupy & 2101248ull) == 0) result |= 8ull;
return result;
case 31:
result = 4194304ull;
if ((occupy & 4194304ull) == 0) result |= 8192ull;
if ((occupy & 4202496ull) == 0) result |= 16ull;
return result;
case 32:
result = 2199023255552ull;
if ((occupy & 2199023255552ull) == 0) result |= 1125899906842624ull;
if ((occupy & 1128098930098176ull) == 0) result |= 576460752303423488ull;
return result;
case 33:
result = 4398063288320ull;
if ((occupy & 4398046511104ull) == 0) result |= 2251799813685248ull;
if ((occupy & 2256197860196352ull) == 0) result |= 1152921504606846976ull;
return result;
case 34:
result = 8796126576640ull;
if ((occupy & 33554432ull) == 0) result |= 65536ull;
if ((occupy & 8796093022208ull) == 0) result |= 4503599627370496ull;
if ((occupy & 4512395720392704ull) == 0) result |= 2305843009213693952ull;
return result;
case 35:
result = 17592253153280ull;
if ((occupy & 67108864ull) == 0) result |= 131072ull;
if ((occupy & 67239936ull) == 0) result |= 256ull;
if ((occupy & 17592186044416ull) == 0) result |= 9007199254740992ull;
if ((occupy & 9024791440785408ull) == 0) result |= 4611686018427387904ull;
return result;
case 36:
result = 35184506306560ull;
if ((occupy & 134217728ull) == 0) result |= 262144ull;
if ((occupy & 134479872ull) == 0) result |= 512ull;
if ((occupy & 134480384ull) == 0) result |= 1ull;
if ((occupy & 35184372088832ull) == 0) result |= 18014398509481984ull;
if ((occupy & 18049582881570816ull) == 0) result |= 9223372036854775808ull;
return result;
case 37:
result = 70369012613120ull;
if ((occupy & 268435456ull) == 0) result |= 524288ull;
if ((occupy & 268959744ull) == 0) result |= 1024ull;
if ((occupy & 268960768ull) == 0) result |= 2ull;
if ((occupy & 70368744177664ull) == 0) result |= 36028797018963968ull;
return result;
case 38:
result = 140738025226240ull;
if ((occupy & 536870912ull) == 0) result |= 1048576ull;
if ((occupy & 537919488ull) == 0) result |= 2048ull;
if ((occupy & 537921536ull) == 0) result |= 4ull;
return result;
case 39:
result = 1073741824ull;
if ((occupy & 1073741824ull) == 0) result |= 2097152ull;
if ((occupy & 1075838976ull) == 0) result |= 4096ull;
if ((occupy & 1075843072ull) == 0) result |= 8ull;
return result;
case 40:
result = 562949953421312ull;
if ((occupy & 562949953421312ull) == 0) result |= 288230376151711744ull;
return result;
case 41:
result = 1125904201809920ull;
if ((occupy & 1125899906842624ull) == 0) result |= 576460752303423488ull;
return result;
case 42:
result = 2251808403619840ull;
if ((occupy & 8589934592ull) == 0) result |= 16777216ull;
if ((occupy & 2251799813685248ull) == 0) result |= 1152921504606846976ull;
return result;
case 43:
result = 4503616807239680ull;
if ((occupy & 17179869184ull) == 0) result |= 33554432ull;
if ((occupy & 17213423616ull) == 0) result |= 65536ull;
if ((occupy & 4503599627370496ull) == 0) result |= 2305843009213693952ull;
return result;
case 44:
result = 9007233614479360ull;
if ((occupy & 34359738368ull) == 0) result |= 67108864ull;
if ((occupy & 34426847232ull) == 0) result |= 131072ull;
if ((occupy & 34426978304ull) == 0) result |= 256ull;
if ((occupy & 9007199254740992ull) == 0) result |= 4611686018427387904ull;
return result;
case 45:
result = 18014467228958720ull;
if ((occupy & 68719476736ull) == 0) result |= 134217728ull;
if ((occupy & 68853694464ull) == 0) result |= 262144ull;
if ((occupy & 68853956608ull) == 0) result |= 512ull;
if ((occupy & 68853957120ull) == 0) result |= 1ull;
if ((occupy & 18014398509481984ull) == 0) result |= 9223372036854775808ull;
return result;
case 46:
result = 36028934457917440ull;
if ((occupy & 137438953472ull) == 0) result |= 268435456ull;
if ((occupy & 137707388928ull) == 0) result |= 524288ull;
if ((occupy & 137707913216ull) == 0) result |= 1024ull;
if ((occupy & 137707914240ull) == 0) result |= 2ull;
return result;
case 47:
result = 274877906944ull;
if ((occupy & 274877906944ull) == 0) result |= 536870912ull;
if ((occupy & 275414777856ull) == 0) result |= 1048576ull;
if ((occupy & 275415826432ull) == 0) result |= 2048ull;
if ((occupy & 275415828480ull) == 0) result |= 4ull;
return result;
case 48:
result = 144115188075855872ull;
return result;
case 49:
result = 288231475663339520ull;
return result;
case 50:
result = 576462951326679040ull;
if ((occupy & 2199023255552ull) == 0) result |= 4294967296ull;
return result;
case 51:
result = 1152925902653358080ull;
if ((occupy & 4398046511104ull) == 0) result |= 8589934592ull;
if ((occupy & 4406636445696ull) == 0) result |= 16777216ull;
return result;
case 52:
result = 2305851805306716160ull;
if ((occupy & 8796093022208ull) == 0) result |= 17179869184ull;
if ((occupy & 8813272891392ull) == 0) result |= 33554432ull;
if ((occupy & 8813306445824ull) == 0) result |= 65536ull;
return result;
case 53:
result = 4611703610613432320ull;
if ((occupy & 17592186044416ull) == 0) result |= 34359738368ull;
if ((occupy & 17626545782784ull) == 0) result |= 67108864ull;
if ((occupy & 17626612891648ull) == 0) result |= 131072ull;
if ((occupy & 17626613022720ull) == 0) result |= 256ull;
return result;
case 54:
result = 9223407221226864640ull;
if ((occupy & 35184372088832ull) == 0) result |= 68719476736ull;
if ((occupy & 35253091565568ull) == 0) result |= 134217728ull;
if ((occupy & 35253225783296ull) == 0) result |= 262144ull;
if ((occupy & 35253226045440ull) == 0) result |= 512ull;
if ((occupy & 35253226045952ull) == 0) result |= 1ull;
return result;
case 55:
result = 70368744177664ull;
if ((occupy & 70368744177664ull) == 0) result |= 137438953472ull;
if ((occupy & 70506183131136ull) == 0) result |= 268435456ull;
if ((occupy & 70506451566592ull) == 0) result |= 524288ull;
if ((occupy & 70506452090880ull) == 0) result |= 1024ull;
if ((occupy & 70506452091904ull) == 0) result |= 2ull;
return result;
case 56:
result = 0ull;
return result;
case 57:
result = 281474976710656ull;
return result;
case 58:
result = 562949953421312ull;
if ((occupy & 562949953421312ull) == 0) result |= 1099511627776ull;
return result;
case 59:
result = 1125899906842624ull;
if ((occupy & 1125899906842624ull) == 0) result |= 2199023255552ull;
if ((occupy & 1128098930098176ull) == 0) result |= 4294967296ull;
return result;
case 60:
result = 2251799813685248ull;
if ((occupy & 2251799813685248ull) == 0) result |= 4398046511104ull;
if ((occupy & 2256197860196352ull) == 0) result |= 8589934592ull;
if ((occupy & 2256206450130944ull) == 0) result |= 16777216ull;
return result;
case 61:
result = 4503599627370496ull;
if ((occupy & 4503599627370496ull) == 0) result |= 8796093022208ull;
if ((occupy & 4512395720392704ull) == 0) result |= 17179869184ull;
if ((occupy & 4512412900261888ull) == 0) result |= 33554432ull;
if ((occupy & 4512412933816320ull) == 0) result |= 65536ull;
return result;
case 62:
result = 9007199254740992ull;
if ((occupy & 9007199254740992ull) == 0) result |= 17592186044416ull;
if ((occupy & 9024791440785408ull) == 0) result |= 34359738368ull;
if ((occupy & 9024825800523776ull) == 0) result |= 67108864ull;
if ((occupy & 9024825867632640ull) == 0) result |= 131072ull;
if ((occupy & 9024825867763712ull) == 0) result |= 256ull;
return result;
case 63:
result = 18014398509481984ull;
if ((occupy & 18014398509481984ull) == 0) result |= 35184372088832ull;
if ((occupy & 18049582881570816ull) == 0) result |= 68719476736ull;
if ((occupy & 18049651601047552ull) == 0) result |= 134217728ull;
if ((occupy & 18049651735265280ull) == 0) result |= 262144ull;
if ((occupy & 18049651735527424ull) == 0) result |= 512ull;
if ((occupy & 18049651735527936ull) == 0) result |= 1ull;
return result;
}
return 0;
}
namespace Lookup_Switch {
static constexpr uint64_t Rook(uint64_t square, uint64_t occupy) {
return GetSliderHCond(square, occupy) | GetSliderVCond(square, occupy);
}
static constexpr uint64_t Rook_Xray(uint64_t square, uint64_t occupy) {
uint64_t attacks = Rook(square, occupy);
return attacks ^ Rook(square, occupy ^ (attacks & occupy));
}
static constexpr uint64_t Bishop(uint64_t square, uint64_t occupy) {
return GetSliderD1Cond(square, occupy) | GetSliderD2Cond(square, occupy);
}
static constexpr uint64_t Bishop_Xray(uint64_t square, uint64_t occupy) {
uint64_t attacks = Bishop(square, occupy);
return attacks ^ Bishop(square, occupy ^ (attacks & occupy));
}
static constexpr uint64_t Queen(uint64_t square, uint64_t occupy) {
return Rook(square, occupy) | Bishop(square, occupy);
}
static constexpr uint64_t Queen_Xray(uint64_t square, uint64_t occupy) {
return Rook_Xray(square, occupy) | Bishop_Xray(square, occupy);
}
};
}
namespace XorRookSub {
struct Mask {
uint64_t diagonal;
uint64_t antidiagonal;
uint64_t vertical;
};
/* Init */
constexpr std::array<Mask, 64> InitMask() {
int r{}, f{}, i{}, j{}, y{};
int d[64]{};
std::array<Mask, 64> MASK{};
for (int x = 0; x < 64; ++x) {
for (y = 0; y < 64; ++y) d[y] = 0;
// directions
for (i = -1; i <= 1; ++i)
for (j = -1; j <= 1; ++j) {
if (i == 0 && j == 0) continue;
f = x & 07;
r = x >> 3;
for (r += i, f += j; 0 <= r && r < 8 && 0 <= f && f < 8; r += i, f += j) {
y = 8 * r + f;
d[y] = 8 * i + j;
}
}
// uint64_t mask
Mask& mask = MASK[x];
for (y = x - 9; y >= 0 && d[y] == -9; y -= 9) mask.diagonal |= (1ull << y);
for (y = x + 9; y < 64 && d[y] == 9; y += 9) mask.diagonal |= (1ull << y);
for (y = x - 7; y >= 0 && d[y] == -7; y -= 7) mask.antidiagonal |= (1ull << y);
for (y = x + 7; y < 64 && d[y] == 7; y += 7) mask.antidiagonal |= (1ull << y);
for (y = x - 8; y >= 0; y -= 8) mask.vertical |= (1ull << y);
for (y = x + 8; y < 64; y += 8) mask.vertical |= (1ull << y);
}
return MASK;
}
constexpr std::array<uint8_t, 512> InitRank() {
std::array<uint8_t, 512> rank_attack{};
for (int x = 0; x < 64; ++x) {
for (int f = 0; f < 8; ++f) {
int o = 2 * x;
int x2{}, y2{};
int b{};
y2 = 0;
for (x2 = f - 1; x2 >= 0; --x2) {
b = 1 << x2;
y2 |= b;
if ((o & b) == b) break;
}
for (x2 = f + 1; x2 < 8; ++x2) {
b = 1 << x2;
y2 |= b;
if ((o & b) == b) break;
}
rank_attack[x * 8 + f] = y2;
}
}
return rank_attack;
}
constexpr std::array<Mask, 64> MASK = InitMask();
constexpr std::array<uint8_t, 512> RANK_ATTACK = InitRank();
/* Start of Code */
constexpr uint64_t bit_bswap_constexpr(uint64_t b) {
b = ((b >> 8) & 0x00FF00FF00FF00FFULL) | ((b << 8) & 0xFF00FF00FF00FF00ULL);
b = ((b >> 16) & 0x0000FFFF0000FFFFULL) | ((b << 16) & 0xFFFF0000FFFF0000ULL);
b = ((b >> 32) & 0x00000000FFFFFFFFULL) | ((b << 32) & 0xFFFFFFFF00000000ULL);
return b;
}
constexpr uint64_t bit_bswap(uint64_t b) {
if (std::is_constant_evaluated()) { return bit_bswap_constexpr(b); }
#if defined(_MSC_VER)
return _byteswap_uint64(b);
#elif defined(__GNUC__)
return __builtin_bswap64(b);
#else
return bit_bswap_constexpr(b);
#endif
}
/* Generate attack using the hyperbola quintessence approach */
constexpr uint64_t attack(uint64_t pieces, uint32_t x, uint64_t mask) {
uint64_t o = pieces & mask;
return ((o - (1ull << x)) ^ bit_bswap(bit_bswap(o) - (1ull << (x ^ 56)))) & mask;
}
constexpr uint64_t horizontal_attack(uint64_t pieces, uint32_t x) {
uint32_t file_mask = x & 7;
uint32_t rank_mask = x & 56;
uint64_t o = (pieces >> rank_mask) & 126;
return ((uint64_t)RANK_ATTACK[o * 4 + file_mask]) << rank_mask;
}
constexpr uint64_t vertical_attack(uint64_t pieces, uint32_t x) {
return attack(pieces, x, MASK[x].vertical);
}
constexpr uint64_t diagonal_attack(uint64_t pieces, uint32_t x) {
return attack(pieces, x, MASK[x].diagonal);
}
constexpr uint64_t antidiagonal_attack(uint64_t pieces, uint32_t x) {
return attack(pieces, x, MASK[x].antidiagonal);
}
constexpr uint64_t bishop_attack(int sq, uint64_t occ) {
return diagonal_attack(occ, sq) | antidiagonal_attack(occ, sq);
}
constexpr uint64_t rook_attack(int sq, uint64_t occ) {
return vertical_attack(occ, sq) | horizontal_attack(occ, sq);
}
constexpr uint64_t Queen(int sq, uint64_t occ) {
return bishop_attack(sq, occ) | rook_attack(sq, occ);
}
}
static std::string _map(uint64_t value)
{
static std::string str(64 + 8, 'o');
for (uint64_t i = 0, c = 0; i < 64; i++)
{
uint64_t bitmask = (1ull) << i;
if ((bitmask & value) != 0) str[c++] = 'X';
else str[c++] = '.';
if ((i + 1) % 8 == 0) str[c++] = '\n';
}
return str;
}
#include <iostream>
using namespace std;
int main()
{
for (int i = 0; i < 64; ++i)
{
auto a = Chess_Lookup::Lookup_Switch::Queen(i, 0xffull<<6);
auto b = XorRookSub::Queen(i, 0xffull<<6);
if (a != b) std::cout << "!ERROR!";
std::cout << _map(Chess_Lookup::Lookup_Switch::Queen(i, 0xffull<<6))<<"\n";
std::cout << _map(XorRookSub::Queen(i, 0xffull<<6))<<"\n";
}
return 0;
}