Submission #1104393

#TimeUsernameProblemLanguageResultExecution timeMemory
1104393fryingduc즐거운 사진 수집 (JOI13_collecting)C++17
100 / 100
935 ms78440 KiB
#include "bits/stdc++.h"
using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = (1 << 20) + 5;
int n, q;

struct segment_tree {
  int n;
  vector<int> tree;
  vector<int> cnt;
  segment_tree() {}
  segment_tree(int n) : n(n), tree(n * 4 + 6), cnt(21, 0) {
    for(int i = 0; i < 21; ++i) {
      cnt[i] = (1 << i);
    }    
  }
  void update(int ind, int l, int r, int pos, int dep) {
    if(l == r) {
      tree[ind] ^= 1;
      return;
    }
    int mid = (l + r) >> 1;
    if(pos <= mid) update(ind << 1, l, mid, pos, dep + 1);
    else update(ind << 1 | 1, mid + 1, r, pos, dep + 1);
    
    if(tree[ind] != -1) --cnt[dep];
    
    if(tree[ind << 1] >= 0 and tree[ind << 1] == tree[ind << 1 | 1]) {
      tree[ind] = tree[ind << 1];
      ++cnt[dep];
    }
    else {
      tree[ind] = -1;
    }
  }
  void update(int pos) {
    update(1, 1, n, pos, 0);
  }
} st[2];
void solve() {
  cin >> n >> q;
  
  st[0] = segment_tree((1 << n));
  st[1] = segment_tree((1 << n));
  
  while(q--) {
    int t, x; cin >> t >> x;
    st[t].update(x);
    
    long long res = 0;
    for(int i = 0; i <= n; ++i) {
      res += (1ll << (i << 1));
      res -= 1ll * st[0].cnt[i] * st[1].cnt[i];
    }
//    debug(st[0].cnt);
//    debug(st[1].cnt);
    cout << res * 4 + 1 << '\n';
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...