#include <bits/stdc++.h> using namespace std; vector<string> split_string(string); // Complete the xorQueries function below. vector<long> xorQueries(vector<int> a, int m, int p) { // Return an array consisting of the answers of all type-2 queries. vector<long> ret1; while (m--) { long a1,b1,c1; cin>>a1>>b1>>c1; if (a1 == 1) { a[b1 - 1] = a[b1 - 1] ^ c1; } if (a1 == 2) { long l = b1, r = c1; long ans = 0; for (long i = l; i<= r; i++) { long ans1 = 0; if (i + p - 1 <= a.size())for (long j = 0; j< p; j++) { ans1 = ans1 ^ a[i - 1 + j]; } ans += ans1; } ret1.push_back(ans); } } // for(int p = 0; p< ret1.size(); p++) // cout<<ret1[p]<<" "; return (ret1); } int main() { ofstream fout(getenv("OUTPUT_PATH")); string nmp_temp; getline(cin, nmp_temp); vector<string> nmp = split_string(nmp_temp); int n = stoi(nmp[0]); int m = stoi(nmp[1]); int p = stoi(nmp[2]); string a_temp_temp; getline(cin, a_temp_temp); vector<string> a_temp = split_string(a_temp_temp); vector<int> a(n); for (int i = 0; i < n; i++) { int a_item = stoi(a_temp[i]); a[i] = a_item; } vector<long> result = xorQueries(a, m, p); for (int i = 0; i < result.size(); i++) { fout << result[i]; if (i != result.size() - 1) { fout << "\n"; } } fout << "\n"; fout.close(); return 0; } vector<string> split_string(string input_string) { string::iterator new_end = unique(input_string.begin(), input_string.end(), [] (const char &x, const char &y) { return x == y and x == ' '; }); input_string.erase(new_end, input_string.end()); while (input_string[input_string.length() - 1] == ' ') { input_string.pop_back(); } vector<string> splits; char delimiter = ' '; size_t i = 0; size_t pos = input_string.find(delimiter); while (pos != string::npos) { splits.push_back(input_string.substr(i, pos - i)); i = pos + 1; pos = input_string.find(delimiter, i); } splits.push_back(input_string.substr(i, min(pos, input_string.length()) - i + 1)); return splits; }