Trilogy xor

 avatar
unknown
c_cpp
5 months ago
1.2 kB
2
Indexable
#include <iostream>
#include <vector>
using namespace std;

int applyMask(int val, int y) {
    return (val & (1 << (y - 1)));
}

int findEnd(const vector<int>& a, int x, int n, int mask) {
    int end = x;
    while (end < n && applyMask(a[end], mask)) {
        end++;
    }
    return end;
}

int solve(vector<int> a, vector<vector<int>> q) {
    int totalUpdates = 0;
    int n = a.size();
    
    for (const auto& query : q) {
        int x = query[0] - 1;
        int y = query[1];
        int z = query[2];
        
        int mask = 1 << (y - 1);
        int end = findEnd(a, x, n, mask);
        
        int sizeToUpdate = end - x;
        
        if (sizeToUpdate > 0) {
            for (int i = x; i < end; ++i) {
                a[i] ^= z;
            }
            totalUpdates += sizeToUpdate;
        }
    }
    
    return totalUpdates;
}

int main() {
    int n, q;
    
    cin >> n;
    vector<int> a(n);
    
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    
    cin >> q;
    vector<vector<int>> queries(q, vector<int>(3));
    
    for (int i = 0; i < q; ++i) {
        cin >> queries[i][0] >> queries[i][1] >> queries[i][2];
    }
    
    cout << solve(a, queries) << endl;

    return 0;
}
Editor is loading...
Leave a Comment