Ankit_132

E

Sep 23rd, 2023 (edited)
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll     long long
  6. #define _test   int _TEST; cin>>_TEST; while(_TEST--)
  7.  
  8. int main()
  9. {
  10.     _test
  11.     {
  12.         ll int n, k, x;
  13.         cin>>n>>x>>k;
  14.  
  15.         if(k == 0)
  16.         {
  17.             cout<<1<<"\n";
  18.             continue;
  19.         }
  20.  
  21.         unordered_map<ll int, ll int> nxt;
  22.         ll int tmp = x;
  23.         while(x > 0)
  24.         {
  25.             nxt[x/2] = x;
  26.             x /= 2;
  27.         }
  28.        
  29.         x = tmp;
  30.  
  31.         ll int ans = 0;
  32.         int dep = 0;
  33.  
  34.         function<ll int(ll int, ll int)> func = [&](ll int u, ll int nodes)
  35.         {
  36.             vector<ll int> lvlNodes(75);
  37.             lvlNodes[0] = 1;
  38.             ll int tot = 1;
  39.             ll int curr = 2;
  40.             int i = 1;
  41.  
  42.             while(tot+curr <= nodes)
  43.             {
  44.                 lvlNodes[i++] = curr;
  45.                 tot += curr;
  46.                 curr *= 2;
  47.             }
  48.  
  49.             ll int rem = (nodes - tot);
  50.  
  51.             lvlNodes[i] = rem;
  52.  
  53.             ll int left = (tot-1)/2;
  54.             ll int right = (tot-1)/2;
  55.  
  56.             if(rem)
  57.             {
  58.                 if(rem <= lvlNodes[i-1])
  59.                     left += rem;
  60.                 else
  61.                 {
  62.                     left += lvlNodes[i-1];
  63.                     right += rem - lvlNodes[i-1];
  64.                 }
  65.             }
  66.  
  67.             ll int tmp = 0;
  68.  
  69.             if(u != x)
  70.             {
  71.                 if(nxt[u]==2*u)         tmp = func(2*u, left);
  72.                 if(nxt[u]==2*u+1)       tmp = func(2*u+1, right);
  73.             }
  74.  
  75.             if(dep<=k && k-dep>=0 && k-dep<70)
  76.             {
  77.                 if(dep == k)        ans += lvlNodes[k-dep];
  78.                 else                ans += lvlNodes[k-dep] - tmp;
  79.             }
  80.  
  81.             dep++;
  82.  
  83.             tmp = 0;
  84.             if(k-dep-1 >= 0 && k-dep-1<70)        tmp = lvlNodes[k-dep-1];
  85.  
  86.             return tmp;
  87.         };
  88.  
  89.         func(1, n);
  90.  
  91.         cout<<ans<<"\n";
  92.     }
  93. }
  94.  
Advertisement
Add Comment
Please, Sign In to add comment