#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_set>
using namespace std;
int faulty;
int balance( const vector< int > & vl, const vector< int > & vr) {
// 1 means first param heavy
// 2 means invalid measurement
if ( vl.size ( ) > 6 || vr.size ( ) > 6 ) return 2 ;
unordered_set< int > l( vl.begin ( ) , vl.end ( ) ) ;
unordered_set< int > r( vr.begin ( ) , vr.end ( ) ) ;
if ( l.size ( ) ! = vl.size ( ) || r.size ( ) ! = vr.size ( ) ) return 2 ;
unordered_set< int > o( vl.begin ( ) , vl.end ( ) ) ;
o.insert ( vr.begin ( ) ,vr.end ( ) ) ;
if ( o.size ( ) ! = l.size ( ) + r.size ( ) ) return 2 ;
if ( l.size ( ) > r.size ( ) ) return 1 ;
if ( l.size ( ) < r.size ( ) ) return - 1 ;
if ( l.find ( faulty) ! = l.end ( ) || r.find ( - faulty) ! = r.end ( ) ) return 1 ;
if ( l.find ( - faulty) ! = l.end ( ) || r.find ( faulty) ! = r.end ( ) ) return - 1 ;
return 0 ;
}
pair< int ,int > puzzle_12( ) {
// return value:
// {faulty_index, heavy/light}
// heavy: 1, light: -1
vector< int > o = { 12 ,1 ,2 ,3 } ;
vector< int > b = { 4 ,5 ,6 ,7 } ;
vector< int > h = { 8 ,9 ,10 ,11 } ;
int x = balance( b,h) ; // 1 means first heavy
if ( x== - 1 ) swap( b,h) ;
if ( x) {
o.push_back ( h[ 3 ] ) ;
h[ 3 ] = b[ 3 ] ;
h.push_back ( b[ 2 ] ) ;
x = balance( h,o) ;
if ( x== 1 ) {
h = { b[ 3 ] } ;
b = { b[ 2 ] } ;
x = balance( b,h) ;
if ( x) return { x== 1 ? b.back ( ) : h.back ( ) ,1 } ;
else return { o.back ( ) ,- 1 } ;
}
else if ( x== - 1 ) {
o = { h[ 1 ] } ;
b = { h[ 2 ] } ;
x = balance( o,b) ;
if ( x) return { x== 1 ? b.back ( ) : o.back ( ) ,- 1 } ;
else return { h[ 0 ] ,- 1 } ;
}
else {
o = { b[ 0 ] } ;
h = { b[ 1 ] } ;
x = balance( o,h) ;
return { x== 1 ? o.back ( ) : h.back ( ) ,1 } ;
}
}
else {
int O = o.back ( ) ;
o.pop_back ( ) ;
int B = b.back ( ) ;
b.pop_back ( ) ;
x = balance( o,b) ;
if ( x) {
int X = x;
O = o.back ( ) ;
o.pop_back ( ) ;
b = { o.back ( ) } ;
o.pop_back ( ) ;
x = balance( o,b) ;
if ( x) return { x== X? o.back ( ) : b.back ( ) ,X} ;
else return { O,X} ;
}
else {
o = { O} ;
b = { B} ;
x = balance( o,b) ;
return { O,x} ; // 1 means heavy
}
}
}
int main( ) {
pair< int ,int > p;
for ( faulty= - 12 ; faulty<= 12 ; faulty++ ) {
if ( ! faulty) continue ;
p = puzzle_12( ) ;
cout << "Ball at index " << p.first << " is " << ( p.second == 1 ? "heavy" : "light" ) << endl;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IGZhdWx0eTsKCmludCBiYWxhbmNlKGNvbnN0IHZlY3RvcjxpbnQ+ICZ2bCwgY29uc3QgdmVjdG9yPGludD4gJnZyKXsKCS8vIDEgbWVhbnMgZmlyc3QgcGFyYW0gaGVhdnkKCS8vIDIgbWVhbnMgaW52YWxpZCBtZWFzdXJlbWVudAoJaWYodmwuc2l6ZSgpPjZ8fHZyLnNpemUoKT42KQlyZXR1cm4gMjsKCXVub3JkZXJlZF9zZXQ8aW50PiBsKHZsLmJlZ2luKCksIHZsLmVuZCgpKTsKCXVub3JkZXJlZF9zZXQ8aW50PiByKHZyLmJlZ2luKCksIHZyLmVuZCgpKTsKCWlmKGwuc2l6ZSgpIT12bC5zaXplKCl8fHIuc2l6ZSgpIT12ci5zaXplKCkpCXJldHVybiAyOwoJdW5vcmRlcmVkX3NldDxpbnQ+IG8odmwuYmVnaW4oKSwgdmwuZW5kKCkpOwoJby5pbnNlcnQodnIuYmVnaW4oKSx2ci5lbmQoKSk7CglpZihvLnNpemUoKSE9bC5zaXplKCkrci5zaXplKCkpCXJldHVybiAyOwoJaWYobC5zaXplKCk+ci5zaXplKCkpCXJldHVybiAxOwoJaWYobC5zaXplKCk8ci5zaXplKCkpCXJldHVybiAtMTsKCWlmKGwuZmluZChmYXVsdHkpIT1sLmVuZCgpfHxyLmZpbmQoLWZhdWx0eSkhPXIuZW5kKCkpCXJldHVybiAxOwoJaWYobC5maW5kKC1mYXVsdHkpIT1sLmVuZCgpfHxyLmZpbmQoZmF1bHR5KSE9ci5lbmQoKSkJcmV0dXJuIC0xOwoJcmV0dXJuIDA7Cn0KcGFpcjxpbnQsaW50PiBwdXp6bGVfMTIoKXsKCS8vIHJldHVybiB2YWx1ZToKCS8vIHtmYXVsdHlfaW5kZXgsIGhlYXZ5L2xpZ2h0fQoJLy8gaGVhdnk6IDEsIGxpZ2h0OiAtMQoJCgl2ZWN0b3I8aW50PiBvID0gezEyLDEsMiwzfTsKCXZlY3RvcjxpbnQ+IGIgPSB7NCw1LDYsN307Cgl2ZWN0b3I8aW50PiBoID0gezgsOSwxMCwxMX07CgkKCWludCB4ID0gYmFsYW5jZShiLGgpOwkvLyAxIG1lYW5zIGZpcnN0IGhlYXZ5CglpZih4PT0tMSkJc3dhcChiLGgpOwoJaWYoeCl7CgkJby5wdXNoX2JhY2soaFszXSk7CgkJaFszXSA9IGJbM107CgkJaC5wdXNoX2JhY2soYlsyXSk7CgkJeCA9IGJhbGFuY2UoaCxvKTsKCQlpZih4PT0xKXsKCQkJaCA9IHtiWzNdfTsKCQkJYiA9IHtiWzJdfTsKCQkJeCA9IGJhbGFuY2UoYixoKTsKCQkJaWYoeCkJcmV0dXJuIHt4PT0xP2IuYmFjaygpOmguYmFjaygpLDF9OwoJCQllbHNlCXJldHVybiB7by5iYWNrKCksLTF9OwoJCX0KCQllbHNlIGlmKHg9PS0xKXsKCQkJbyA9IHtoWzFdfTsKCQkJYiA9IHtoWzJdfTsKCQkJeCA9IGJhbGFuY2UobyxiKTsKCQkJaWYoeCkJcmV0dXJuIHt4PT0xP2IuYmFjaygpOm8uYmFjaygpLC0xfTsKCQkJZWxzZQlyZXR1cm4ge2hbMF0sLTF9OwoJCX0KCQllbHNlewoJCQlvID0ge2JbMF19OwoJCQloID0ge2JbMV19OwoJCQl4ID0gYmFsYW5jZShvLGgpOwoJCQlyZXR1cm4ge3g9PTE/by5iYWNrKCk6aC5iYWNrKCksMX07CgkJfQoJfQoJZWxzZXsKCQlpbnQgTyA9IG8uYmFjaygpOwoJCW8ucG9wX2JhY2soKTsKCQlpbnQgQiA9IGIuYmFjaygpOwoJCWIucG9wX2JhY2soKTsKCQl4ID0gYmFsYW5jZShvLGIpOwoJCWlmKHgpewoJCQlpbnQgWCA9IHg7CgkJCU8gPSBvLmJhY2soKTsKCQkJby5wb3BfYmFjaygpOwoJCQliID0ge28uYmFjaygpfTsKCQkJby5wb3BfYmFjaygpOwoJCQl4ID0gYmFsYW5jZShvLGIpOwoJCQlpZih4KQlyZXR1cm4ge3g9PVg/by5iYWNrKCk6Yi5iYWNrKCksWH07CgkJCWVsc2UJcmV0dXJuIHtPLFh9OwoJCX0KCQllbHNlewoJCQlvID0ge099OwoJCQliID0ge0J9OwoJCQl4ID0gYmFsYW5jZShvLGIpOwoJCQlyZXR1cm4ge08seH07CS8vIDEgbWVhbnMgaGVhdnkKCQl9Cgl9Cn0KaW50IG1haW4oKSB7CglwYWlyPGludCxpbnQ+IHA7Cglmb3IoZmF1bHR5PS0xMjsgZmF1bHR5PD0xMjsgZmF1bHR5KyspewoJCWlmKCFmYXVsdHkpCWNvbnRpbnVlOwoJCXAgPSBwdXp6bGVfMTIoKTsKCQljb3V0PDwiQmFsbCBhdCBpbmRleCAiPDxwLmZpcnN0PDwiIGlzICI8PChwLnNlY29uZD09MT8iaGVhdnkiOiJsaWdodCIpPDxlbmRsOwoJfQoJcmV0dXJuIDA7Cn0=