思路

很明显我们恢复序列时要把加法变成减法,把乘法变成除法,但因为猴子是从前往后操作的,所以我们要从后往前恢复。

特别且显然地,当 x=yx=y,新的 xx 就等于原来的 xx 两倍或平方。

如果 x=yx=y,且操作为 11 号操作,我们就需要把 bxb_x 的值除以 22,若为 22 号操作,我们就需要把 bxb_x 变为 bx\sqrt{b_x}

提醒

恢复序列时要从最后一个操作开始恢复!

代码

#include<iostream>
#include<cmath>
using namespace std;
int n,m,k[205],x[205],y[205];
long long b[1005];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>b[i];
    }
    for(int i=1;i<=m;i++){
        cin>>k[i]>>x[i]>>y[i];
    }
    for(int i=m;i>=1;i--){
        if(k[i]==1){
            if(x[i]==y[i]){
                b[x[i]]/=2;
            }else{
                b[x[i]]-=b[y[i]];
            }
        }
        if(k[i]==2){
            if(x[i]==y[i]){
                b[x[i]]=sqrt(b[x[i]]);
            }else{
                b[x[i]]/=b[y[i]];
            }
        }
    }
    for(int i=1;i<=n;i++){
        cout<<b[i]<<' ';
    }
    return 0;
}