#include <bits/stdc++.h>   using namespace std;   set<pair<long long, long long> > S;   set<pair<long long, long long> >::iterator it;   set<pair<long long, long long> >::iterator it2;   pair<long long, long long> temp;   void intersect_yes(long long s, long long e) {     if (S.empty()) return;     for (it = S.begin(); it != S.end();) {       if (it->first < s && it->second < s)         S.erase(it++);       else         break;     }     if (S.empty()) return;     bool finish = 0;     for (it = --S.end(); !finish;) {       if (it == S.begin()) finish = true;       if (it->first > e)         S.erase(it--);       else         break;     }     if (S.empty()) return;     temp = *S.begin();     S.erase(temp);     temp.first = max(s, temp.first);     S.insert(temp);     temp = *(--S.end());     S.erase(temp);     temp.second = min(temp.second, e);     S.insert(temp);   }   const long long big = 1LL << 55;   void intersect_no(long long s, long long e) {     it = S.lower_bound(make_pair(s, big));     if (it != S.begin()) it--;     it2 = S.upper_bound(make_pair(e, big));     while (it != it2) {       if (it->second < s)         it++;       else if (it->first < s) {         if (it->second >= s && it->second <= e) {           temp = *it;           it++;           S.erase(temp);           S.insert(make_pair(temp.first, s - 1));         } else if (it->second > e) {           temp = *it;           it++;           S.erase(temp);           S.insert(make_pair(temp.first, s - 1));           S.insert(make_pair(e + 1, temp.second));         }       } else if (it->first >= s && it->first <= e) {         if (it->second <= e) {           S.erase(it++);         } else if (it->second > e) {           temp = *it;           it++;           S.erase(temp);           S.insert(make_pair(e + 1, temp.second));         }       }     }   }   int main() {     int h, q, lvl, ans;     long long l, r;     scanf( %d%d , &h, &q);     long long begining = 1LL << (h - 1), ending = (1LL << h) - 1;     S.insert(make_pair(begining, ending));     for (int i = 0; i < q; i++) {       scanf( %d%I64d%I64d%d , &lvl, &l, &r, &ans);       long long left = l * (1LL << (h - lvl)),                 right = (r + 1) * (1LL << (h - lvl)) - 1;       if (S.empty()) {         printf( Game cheated! n );         return 0;       }       if (ans)         intersect_yes(left, right);       else         intersect_no(left, right);     }     if (S.empty())       printf( Game cheated! n );     else if (S.size() == 1 && (*S.begin()).first == (*S.begin()).second)       printf( %I64d n , (*S.begin()).first);     else       printf( Data not sufficient! n );   }   