#include <iostream>
#include <vector>
#include <string>
/* LEGENDA:
U-Górny zakres, D-Dolny zakres, sign-operator, dig-liczba, yn-operator logiczny(tak/nie), vector exc-wektor przechowujący wyjątki
WUD-współczynnik nadawany na podstawie "sign" i "yn", T1-liczba testów, T2-liczba czynników, F-liczba kłamstw z rzędu,
maxF-największa liczba kłamst z rzędu
*/
bool CheckT( int & U, int & D, char & sign, int & dig, std:: string & yn, std:: vector < int > & exc, int & WUD) // sprawdzam czy nowy operator nie wychodzi poza zakresy, nadaje WUD i dodaje wyjątki
{
if ( sign == '<' && yn == "tak" )
{
WUD = 1 ;
return true ;
}
if ( sign == '>' && yn == "nie" )
{
WUD = 2 ;
return true ;
}
if ( sign == '<' && yn == "nie" )
{
WUD = 3 ;
return true ;
}
if ( sign == '>' && yn == "tak" )
{
WUD = 4 ;
return true ;
}
if ( sign == '=' && yn == "tak" )
{
WUD= 5 ;
if ( dig <= U && dig >= D) // jeśli zawiera się w zbiorze zmienia zakresy na liczbę dig
{
U = dig;
D = dig;
return true ;
}
else // jeśli się nie zawiera z zbiorach oznacza kłamstwo
{
return false ;
}
}
if ( ( sign == '=' && yn == "nie" ) )
{
WUD = 6 ;
if ( dig > U || dig < D) // jeśli wykracza poza zbiór nie jest uwzględniany jako wyjątek
{
return true ;
}
else // jeśli zawiera się w zbiorze sprawdza czy znajduje się obecnie w vektorze
{
int size = exc.size ( ) ;
if ( size)
{
for ( int x : exc)
{
if ( x == dig) // jeśli się znajduje nie dodaje go do "exc" i kończy funkcje
{
return true ;
break ;
}
}
}
exc.push_back ( dig) ; // nie występuje w vektorze i jest dodawany
return true ;
}
}
return false ;
}
void WUDa( int & U, int & D,int & WUD, int & dig) // funkcja korzystająca z współczynnika WUD zmieniająca zakresy
{
if ( WUD! = 6 )
{
switch ( WUD)
{
case 1 :
{
U = dig - 1 ;
break ;
}
case 2 :
{
U = dig;
break ;
}
case 3 :
{
D = dig;
break ;
}
case 4 :
{
D = dig + 1 ;
break ;
}
case 5 :
{
D = dig;
U = dig;
break ;
}
default :
break ;
}
}
}
void Fexe( int & U, int & D, int & dig, std:: vector < int > & exc, int & WUD) // czyści wyjątki, zmienia zakres na podstawowy, a następnie wywołuje funkcje WUDa
{
exc.clear ( ) ;
D = 1 ;
U = 1000000001 ;
WUDa( U, D, WUD, dig) ;
if ( WUD== 6 ) // jeśli nowe wyrażenie zawierało "=" i "nie", dodaje "dig" do wektora wyjątków
{
exc.push_back ( dig) ;
}
}
bool CheckF( int & U, int & D, char & sign, int & dig, std:: string & yn, std:: vector < int > & exc, int & WUD) // sprawdza warunki fałszu
{
if ( U- D== exc.size ( ) - 1 && exc.size ( ) ! = 0 ) // sprawdzam czy wszystkie mozliwe liczby zostaly zanegowane
{
return true ;
}
else if ( U< D)
{
return true ;
}
else if ( WUD== 5 && ( dig< D || dig> U) ) // jeśli nowe wyrażenie zawierało "=" i "tak" i nie zawiera się w zbiorze oznacza kłamstwo
{
return true ;
}
else if ( WUD== 6 && U== D && dig== U) // jeśli nowe wyrażenie zawierało "=" i "nie" i nowy "dig" i oba ekstrema wykresu są równe oznacza kłamstwo
{
return true ;
}
if ( dig > U || dig < D)
{
return false ;
}
else
{
return false ;
}
}
int main( )
{
std:: ios_base :: sync_with_stdio ( 0 ) ;
int T;
std:: cin >> T;
while ( T-- )
{
int T2, dig, F = 0 , maxF = 0 ;
std:: vector < int > exc;
std:: cin >> T2;
char sign;
std:: string yn;
int U = 1000000001 , D = 1 , WUD = 0 ;
while ( T2-- )
{
std:: cin >> sign >> dig >> yn;
if ( CheckT( U, D, sign, dig, yn, exc, WUD) ) //sprawdzam czy spełnia warunki prawdy
{
WUDa( U, D, WUD, dig) ; //manipuluje zakresami
F= 0 ;
}
if ( CheckF( U, D, sign, dig, yn, exc, WUD) ) //sprawdzam czy spełnia warunki fałszu
{
F++ ;
Fexe( U, D, dig, exc, WUD) ;
}
if ( maxF < F)
{
maxF = F;
}
// ----------------------------------------------------------------------------
std:: cout << "KOMENTARZ: zakres gorny: " << U << " zakres dolny: " << D << " bledy: " << F << " Wyjatki: " << '\n ' ;
for ( int i : exc)
{
std:: cout << i<< ' ' ;
}
if ( ! exc.size ( ) )
{
std:: cout << " ---" ;
}
std:: cout << '\n ' ;
// ----------------------------------------------------------------------------
}
std:: cout << maxF << '\n ' ;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgovKiBMRUdFTkRBOgpVLUfDs3JueSB6YWtyZXMsIEQtRG9sbnkgemFrcmVzLCBzaWduLW9wZXJhdG9yLCBkaWctbGljemJhLCB5bi1vcGVyYXRvciBsb2dpY3pueSh0YWsvbmllKSwgdmVjdG9yIGV4Yy13ZWt0b3IgcHJ6ZWNob3d1asSFY3kgd3lqxIV0a2kKV1VELXdzcMOzxYJjenlubmlrIG5hZGF3YW55IG5hIHBvZHN0YXdpZSAic2lnbiIgaSAieW4iLCBUMS1saWN6YmEgdGVzdMOzdywgVDItbGljemJhIGN6eW5uaWvDs3csIEYtbGljemJhIGvFgmFtc3R3IHogcnrEmWR1LCAKbWF4Ri1uYWp3acSZa3N6YSBsaWN6YmEga8WCYW1zdCB6IHJ6xJlkdQoqLwpib29sIENoZWNrVChpbnQgJlUsIGludCAmRCwgY2hhciAmc2lnbiwgaW50ICZkaWcsIHN0ZDo6c3RyaW5nICZ5biwgc3RkOjp2ZWN0b3I8aW50PiAmZXhjLCBpbnQgJldVRCkgLy8gc3ByYXdkemFtIGN6eSBub3d5IG9wZXJhdG9yIG5pZSB3eWNob2R6aSBwb3phIHpha3Jlc3ksIG5hZGFqZSBXVUQgaSBkb2RhamUgd3lqxIV0a2kKewogICAgaWYgKHNpZ24gPT0gJzwnICYmIHluID09ICJ0YWsiKQogICAgewogICAgICAgIFdVRCA9IDE7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoc2lnbiA9PSAnPicgJiYgeW4gPT0gIm5pZSIpCiAgICB7CiAgICAgICAgV1VEID0gMjsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChzaWduID09ICc8JyAmJiB5biA9PSAibmllIikKICAgIHsKICAgICAgICBXVUQgPSAzOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHNpZ24gPT0gJz4nICYmIHluID09ICJ0YWsiKQogICAgewogICAgICAgIFdVRCA9IDQ7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoc2lnbiA9PSAnPScgJiYgeW4gPT0gInRhayIpCiAgICB7CiAgICAgICAgV1VEPTU7CiAgICAgICAgaWYgKGRpZyA8PSBVICYmIGRpZyA+PSBEKSAvLyBqZcWbbGkgemF3aWVyYSBzacSZIHcgemJpb3J6ZSB6bWllbmlhIHpha3Jlc3kgbmEgbGljemLEmSBkaWcKICAgICAgICB7CiAgICAgICAgICAgIFUgPSBkaWc7CiAgICAgICAgICAgIEQgPSBkaWc7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlICAgIC8vIGplxZtsaSBzacSZIG5pZSB6YXdpZXJhIHogemJpb3JhY2ggb3puYWN6YSBrxYJhbXN0d28KICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoKHNpZ24gPT0gJz0nICYmIHluID09ICJuaWUiKSkKICAgIHsKICAgICAgICBXVUQgPSA2OwogICAgICAgIGlmIChkaWcgPiBVIHx8IGRpZyA8IEQpIC8vIGplxZtsaSB3eWtyYWN6YSBwb3phIHpiacOzciBuaWUgamVzdCB1d3pnbMSZZG5pYW55IGpha28gd3lqxIV0ZWsKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIC8vIGplxZtsaSB6YXdpZXJhIHNpxJkgdyB6YmlvcnplIHNwcmF3ZHphIGN6eSB6bmFqZHVqZSBzacSZIG9iZWNuaWUgdyB2ZWt0b3J6ZQogICAgICAgIHsKICAgICAgICAgICAgaW50IHNpemUgPSBleGMuc2l6ZSgpOwogICAgICAgICAgICBpZiAoc2l6ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yIChpbnQgeCA6IGV4YykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoeCA9PSBkaWcpIC8vIGplxZtsaSBzacSZIHpuYWpkdWplIG5pZSBkb2RhamUgZ28gZG8gImV4YyIgaSBrb8WEY3p5IGZ1bmtjamUKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXhjLnB1c2hfYmFjayhkaWcpOyAvLyBuaWUgd3lzdMSZcHVqZSB3IHZla3RvcnplIGkgamVzdCBkb2Rhd2FueQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0Kdm9pZCBXVURhKGludCAmVSwgaW50ICZELGludCAmV1VELCBpbnQgJmRpZykgLy8gZnVua2NqYSBrb3J6eXN0YWrEhWNhIHogd3Nww7PFgmN6eW5uaWthIFdVRCB6bWllbmlhasSFY2EgemFrcmVzeQp7CiAgICBpZihXVUQhPTYpCiAgICB7CiAgICAgICAgc3dpdGNoIChXVUQpCiAgICB7CiAgICBjYXNlIDE6CiAgICB7CiAgICAgICAgVSA9IGRpZyAtIDE7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIDI6CiAgICB7CiAgICAgICAgVSA9IGRpZzsKICAgICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgMzoKICAgIHsKICAgICAgICBEID0gZGlnOwogICAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSA0OgogICAgewogICAgICAgIEQgPSBkaWcgKyAxOwogICAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSA1OgogICAgewogICAgICAgIEQgPSBkaWc7CiAgICAgICAgVSA9IGRpZzsKICAgICAgICBicmVhazsKICAgIH0KICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9ICAKICAgIH0gCn0Kdm9pZCBGZXhlKGludCAmVSwgaW50ICZELCBpbnQgJmRpZywgc3RkOjp2ZWN0b3I8aW50PiAmZXhjLCBpbnQgJldVRCkgLy8gY3p5xZtjaSB3eWrEhXRraSwgem1pZW5pYSB6YWtyZXMgbmEgcG9kc3Rhd293eSwgYSBuYXN0xJlwbmllIHd5d2/FgnVqZSBmdW5rY2plIFdVRGEKewogICAgZXhjLmNsZWFyKCk7CiAgICBEID0gMTsKICAgIFUgPSAxMDAwMDAwMDAxOwogICAgV1VEYShVLCBELCBXVUQsIGRpZyk7CiAgICBpZihXVUQ9PTYpIC8vIGplxZtsaSBub3dlIHd5cmHFvGVuaWUgemF3aWVyYcWCbyAiPSIgaSAibmllIiwgZG9kYWplICJkaWciIGRvIHdla3RvcmEgd3lqxIV0a8OzdwogICAgewogICAgICAgIGV4Yy5wdXNoX2JhY2soZGlnKTsKICAgIH0KfQpib29sIENoZWNrRihpbnQgJlUsIGludCAmRCwgY2hhciAmc2lnbiwgaW50ICZkaWcsIHN0ZDo6c3RyaW5nICZ5biwgc3RkOjp2ZWN0b3I8aW50PiAmZXhjLCBpbnQgJldVRCkgLy8gc3ByYXdkemEgd2FydW5raSBmYcWCc3p1CnsKICAgIGlmKFUtRD09ZXhjLnNpemUoKS0xICYmIGV4Yy5zaXplKCkhPTApIC8vIHNwcmF3ZHphbSBjenkgd3N6eXN0a2llIG1vemxpd2UgbGljemJ5IHpvc3RhbHkgemFuZWdvd2FuZQogICAgewogICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBlbHNlIGlmKFU8RCkKICAgIHsKICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZWxzZSBpZihXVUQ9PTUgJiYgKGRpZzxEIHx8IGRpZz5VKSkgLy8gamXFm2xpIG5vd2Ugd3lyYcW8ZW5pZSB6YXdpZXJhxYJvICI9IiBpICJ0YWsiIGkgIG5pZSB6YXdpZXJhIHNpxJkgdyB6YmlvcnplIG96bmFjemEga8WCYW1zdHdvCiAgICB7CiAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGVsc2UgaWYoV1VEPT02ICYmIFU9PUQgJiYgZGlnPT1VKSAvLyBqZcWbbGkgbm93ZSB3eXJhxbxlbmllIHphd2llcmHFgm8gIj0iIGkgIm5pZSIgaSBub3d5ICJkaWciIGkgb2JhIGVrc3RyZW1hIHd5a3Jlc3Ugc8SFIHLDs3duZSBvem5hY3phIGvFgmFtc3R3bwogICAgewogICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoZGlnID4gVSB8fCBkaWcgPCBEKQogICAgewogICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZQogICAgewogICAgcmV0dXJuIGZhbHNlOwogICAgfQp9CmludCBtYWluKCkKewogICAgc3RkOjppb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgaW50IFQ7CiAgICBzdGQ6OmNpbiA+PiBUOwogICAgd2hpbGUgKFQtLSkKICAgIHsKICAgICAgICBpbnQgVDIsIGRpZywgRiA9IDAsIG1heEYgPSAwOwogICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZXhjOwogICAgICAgIHN0ZDo6Y2luID4+IFQyOwogICAgICAgIGNoYXIgc2lnbjsKICAgICAgICBzdGQ6OnN0cmluZyB5bjsKICAgICAgICBpbnQgVSA9IDEwMDAwMDAwMDEsIEQgPSAxLCBXVUQgPSAwOwogICAgICAgIHdoaWxlIChUMi0tKQogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjaW4gPj4gc2lnbiA+PiBkaWcgPj4geW47CiAgICAgICAgICAgIGlmIChDaGVja1QoVSwgRCwgc2lnbiwgZGlnLCB5biwgZXhjLCBXVUQpKS8vc3ByYXdkemFtIGN6eSBzcGXFgm5pYSB3YXJ1bmtpIHByYXdkeQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBXVURhKFUsIEQsIFdVRCwgZGlnKTsvL21hbmlwdWx1amUgemFrcmVzYW1pCiAgICAgICAgICAgICAgICBGPTA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKENoZWNrRihVLCBELCBzaWduLCBkaWcsIHluLCBleGMsIFdVRCkpLy9zcHJhd2R6YW0gY3p5IHNwZcWCbmlhIHdhcnVua2kgZmHFgnN6dQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGKys7CiAgICAgICAgICAgICAgICBGZXhlKFUsIEQsIGRpZywgZXhjLCBXVUQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtYXhGIDwgRikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWF4RiA9IEY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIktPTUVOVEFSWjogemFrcmVzIGdvcm55OiAiIDw8IFUgPDwgIiB6YWtyZXMgZG9sbnk6ICIgPDwgRCA8PCAiIGJsZWR5OiAiIDw8IEYgPDwiIFd5amF0a2k6ICI8PCdcbic7CiAgICAgICAgICAgIGZvcihpbnQgaSA6IGV4YykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RkOjpjb3V0PDxpPDwnICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIWV4Yy5zaXplKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6Y291dDw8IiAtLS0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZDo6Y291dDw8J1xuJzsKICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIH0KICAgICAgICBzdGQ6OmNvdXQgPDwgbWF4RiA8PCAnXG4nOwogICAgfQp9