思路

根据异或的性质,可以得出有且仅有 xx=0x\oplus x=0。不同的两个数字异或结果一定不为 00

因此对于每次操作,我们仅需将 axaxya_x \gets a_x-y 即可。当 x=0x=0,我们什么都不做。

时间复杂度 O(n+m)O(n+m),在 1n,m1061 \le n,m \le 10^6 情况下不会超时。

注意由于 108y108-10^8 \le y \le 10^8,经过操作后 aa 数组可能会超过 int 范围,需要使用 long long

代码

#include<iostream>
using namespace std;
int n,m;
long long a[1000005];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    while(m--){
        int x,y;
        cin>>x>>y;
        if(x!=0){
            a[x]=a[x]-y;
        }
    }
    for(int i=1;i<=n;i++){
        cout<<a[i]<<' ';
    }
    return 0;
}