Submission #2753962


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

template<class Monoid, class OperatorMonoid = Monoid>
struct LazySegmentTree {
  using FunctionM = function< Monoid(Monoid, Monoid) >;
  using FunctionMO = function< Monoid(Monoid, OperatorMonoid, int) >; // 3rd param = length;
  using FunctionO = function < OperatorMonoid(OperatorMonoid, OperatorMonoid) >;

  int N; vector<Monoid> segment; vector<OperatorMonoid> lazy;
  const FunctionM FuncM; const FunctionMO FuncMO; const FunctionO FuncO;
  const Monoid idM; const OperatorMonoid idOM;

  LazySegmentTree(int n, const FunctionM FuncM, const FunctionMO FuncMO, const FunctionO FuncO,
    const Monoid idM, const OperatorMonoid idOM)
  : FuncM(FuncM), FuncMO(FuncMO), FuncO(FuncO), idM(idM), idOM(idOM) {
    N = 1;
    while (N < n) N <<= 1;
    segment.assign(2 * N, idM); lazy.assign(2 * N, idOM);
  }

  void set(int num, Monoid x) {
    segment[N + num] = x;
  }
  void build() {
    for (int k = N - 1; k > 0; k--) {
      segment[k] = FuncM(segment[2*k], segment[2*k+1]);
    }
  }

  void propagate(int k, int len){
    if (lazy[k] != idOM) {
      if (k < N) {
        lazy[2*k] = FuncO(lazy[2*k], lazy[k]);
        lazy[2*k+1] = FuncO(lazy[2*k+1], lazy[k]);
      }
      segment[k] = FuncMO(segment[k], lazy[k], len);
      lazy[k] = idOM;
    }
  }

  Monoid update(int a, int b, const OperatorMonoid x) {
    return update(a, b, x, 1, 0, N);
  }
  Monoid update(int a, int b, const OperatorMonoid x, int k, int l, int r){
    propagate(k, r-l);
    if (b <= l || r <= a) {
      return segment[k];
    } else if (a <= l && r <= b) {
      lazy[k] = FuncO(lazy[k], x);
      propagate(k, r-l);
      return segment[k];
    } else {
      int m = (l + r) / 2;
      return segment[k] = FuncM(update(a, b, x, 2*k, l, m), update(a, b, x, 2*k+1, m, r));
    }
  }

  Monoid query(int a, int b) {
    return query(a, b, 1, 0, N);
  }
  Monoid query(int a, int b, int k, int l, int r) {
    propagate(k, r-l);
    if (b <= l || r <= a) {
      return idM;
    } else if (a <= l && r <= b) {
      return segment[k];
    } else {
      int m = (l + r) / 2;
      return FuncM(query(a, b, 2*k, l, m), query(a, b, 2*k+1, m, r));
    }
  }

  // 0-indexed numbering;
  Monoid operator[](const int &k) {
    return query(k, k + 1);
  }
};

int F(int a, int b) {return a + b;}; // sum
int G(int a, int b, int len) {return len - a;}; // bit inversion (xor 1)
int H(int a, int b) {return a xor b;}; // xor

int main(){
  int n, q; cin >> n >> q;
  LazySegmentTree<int> lst(n, F, G, H, 0, 0);
  for (int i = 0; i < q; i++) {
    int a, b, c; cin >> a >> b >> c;
    if (a == 1) lst.update(b, c, 1);
    else cout << lst.query(b, c) << endl;
  }
  return 0;
}

Submission Info

Submission Time
Task H - Counting 1's
User potoooooooo
Language C++14 (GCC 5.4.1)
Score 100
Code Size 2798 Byte
Status AC
Exec Time 276 ms
Memory 2560 KB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3 Subtask4
Score / Max Score 0 / 0 4 / 4 12 / 12 36 / 36 48 / 48
Status
AC × 3
AC × 12
AC × 6
AC × 6
AC × 21
Set Name Test Cases
Sample sample_1.txt, sample_2.txt, sample_3.txt
Subtask1 sample_1.txt, sample_2.txt, sample_3.txt, sub1_1.txt, sub1_2.txt, sub1_3.txt, sub1_4.txt, sub1_5.txt, sub1_6.txt, sub1_7.txt, sub1_8.txt, sub1_9.txt
Subtask2 sample_1.txt, sample_2.txt, sample_3.txt, sub2_1.txt, sub2_2.txt, sub2_3.txt
Subtask3 sample_1.txt, sample_2.txt, sample_3.txt, sub3_1.txt, sub3_2.txt, sub3_3.txt
Subtask4 sample_1.txt, sample_2.txt, sample_3.txt, sub1_1.txt, sub1_2.txt, sub1_3.txt, sub1_4.txt, sub1_5.txt, sub1_6.txt, sub1_7.txt, sub1_8.txt, sub1_9.txt, sub2_1.txt, sub2_2.txt, sub2_3.txt, sub3_1.txt, sub3_2.txt, sub3_3.txt, sub4_1.txt, sub4_2.txt, sub4_3.txt
Case Name Status Exec Time Memory
sample_1.txt AC 1 ms 256 KB
sample_2.txt AC 1 ms 256 KB
sample_3.txt AC 1 ms 256 KB
sub1_1.txt AC 1 ms 256 KB
sub1_2.txt AC 1 ms 256 KB
sub1_3.txt AC 1 ms 256 KB
sub1_4.txt AC 4 ms 256 KB
sub1_5.txt AC 2 ms 256 KB
sub1_6.txt AC 2 ms 256 KB
sub1_7.txt AC 8 ms 256 KB
sub1_8.txt AC 12 ms 256 KB
sub1_9.txt AC 13 ms 384 KB
sub2_1.txt AC 178 ms 2304 KB
sub2_2.txt AC 178 ms 2304 KB
sub2_3.txt AC 178 ms 2304 KB
sub3_1.txt AC 220 ms 2560 KB
sub3_2.txt AC 220 ms 2560 KB
sub3_3.txt AC 221 ms 2560 KB
sub4_1.txt AC 276 ms 2560 KB
sub4_2.txt AC 275 ms 2560 KB
sub4_3.txt AC 275 ms 2560 KB