Submission #547213

#TimeUsernameProblemLanguageResultExecution timeMemory
547213vlad_TTXORanges (eJOI19_xoranges)C++17
100 / 100
517 ms9228 KiB
#include <iostream>

const int MAX_N = 2 * 1e5;
int a[2][1 + MAX_N / 2], aint[2][1 + 4 * MAX_N];

void buildPar(int v, int l, int r) {
  if (l == r) {
    aint[0][v] = a[0][l];
  } else {
    int mid = (l + r) / 2;
    buildPar(2 * v, l, mid);
    buildPar(2 * v + 1, mid + 1, r);
    aint[0][v] = aint[0][2 * v] ^ aint[0][2 * v + 1];
  }
}

void buildImp(int v, int l, int r) {
  if (l == r) {
    aint[1][v] = a[1][l];
  } else {
    int mid = (l + r) / 2;
    buildImp(2 * v, l, mid);
    buildImp(2 * v + 1, mid + 1, r);
    aint[1][v] = aint[1][2 * v] ^ aint[1][2 * v + 1];
  }
}

void updatePar(int v, int l, int r, int pos, int val) {
  if (l == r) {
    aint[0][v] = val;
  } else {
    int mid = (l + r) / 2;
    if (pos <= mid) {
      updatePar(2 * v, l, mid, pos, val);
    } else {
      updatePar(2 * v + 1, mid + 1, r, pos, val);
    }
    aint[0][v] = aint[0][2 * v] ^ aint[0][2 * v + 1];
  }
}

void updateImp(int v, int l, int r, int pos, int val) {
  if (l == r) {
    aint[1][v] = val;
  } else {
    int mid = (l + r) / 2;
    if (pos <= mid) {
      updateImp(2 * v, l, mid, pos, val);
    } else {
      updateImp(2 * v + 1, mid + 1, r, pos, val);
    }
    aint[1][v] = aint[1][2 * v] ^ aint[1][2 * v + 1];
  }
}

int queryPar(int v, int l, int r, int p, int q) {
  if (p > q) {
    return 0;
  } else if (l == p && r == q) {
    return aint[0][v];
  } else {
    int mid = (l + r) / 2;
    return queryPar(2 * v, l, mid, p, std::min(mid, q)) ^ queryPar(2 * v + 1, mid + 1, r, std::max(p, mid + 1), q);
  }
}

int queryImp(int v, int l, int r, int p, int q) {
  if (p > q) {
    return 0;
  } else if (l == p && r == q) {
    return aint[1][v];
  } else {
    int mid = (l + r) / 2;
    return queryImp(2 * v, l, mid, p, std::min(mid, q)) ^ queryImp(2 * v + 1, mid + 1, r, std::max(p, mid + 1), q);
  }
}

int main() {
  int n, q;
  std::cin >> n >> q;
  for (int i = 1; i <= n; i++) {
    std::cin >> a[i % 2][i / 2 + i % 2];
  }
  int len = (n + 1) / 2;
  buildImp(1, 1, len);
  buildPar(1, 1, n - len);
  while (q--) {
    int t;
    std::cin >> t;
    if (t == 1) {
      int pos, val;
      std::cin >> pos >> val;
      if (pos % 2 == 1) {
        updateImp(1, 1, len, (pos + 1) / 2, val);
      } else {
        updatePar(1, 1, n - len, pos / 2, val);
      }
    } else {
      int l, r;
      std::cin >> l >> r;
      if ((r - l + 1) % 2 == 0) {
        std::cout << "0\n";
      } else {
        if (l % 2 == 0) {
          std::cout << queryPar(1, 1, n - len, (l + 1) / 2, (r + 1) / 2) << "\n";
        } else {
          std::cout << queryImp(1, 1, len, (l + 1) / 2, (r + 1) / 2) << "\n";
        }
      }
    }
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...