#include #include #include #include #define REP(i,a,n) for(ll i=a;i> mul_matrix(vector> A,vector> B){ vector> result(A.size(),vector(B[0].size())); REP(i,0,A.size()){ REP(j,0,B[0].size()){ REP(k,0,A[0].size()){ result[i][j]+=A[i][k]*B[k][j]; } } } return result; } int main(){ vector> input(3,vector(1)); vector> output(3,vector(1)); vector> command_matrix(3,vector(3)); vector> stack_matrix(3,vector(3)); vector> inputlist; list> anslist; ll n,x,y,command,d; cin >> n >> x >> y; input[0][0]=1; input[1][0]=x; input[2][0]=y; stack_matrix={ {1,0,0}, {0,1,0}, {0,0,1}}; //inputの列を格納 REP(i,0,n){ cin >> command; d=0; if(command!=3) cin >> d; inputlist.push_back(make_pair(command,d)); } //行列計算 for(int i=n-1;i>=0;i--){ //cout<< i << endl; command=inputlist[i].first; d=inputlist[i].second; switch(command){ case 1: command_matrix={ {1,0,0}, {d,1,0}, {0,0,1}}; break; case 2: command_matrix={ {1,0,0}, {0,1,0}, {d,0,1}}; break; case 3: command_matrix={ {1,0,0}, {0,0,1}, {0,-1,0}}; break; } /** REP(i,0,command_matrix.size()){ REP(j,0,command_matrix[0].size()){ cout << command_matrix[i][j] << " "; } cout << endl; } **/ stack_matrix=mul_matrix(stack_matrix,command_matrix); output = mul_matrix(stack_matrix,input); anslist.push_front(make_pair(output[1][0],output[2][0])); } for(auto itr=anslist.begin();itr!=anslist.end();itr++){ cout << (*itr).first << " " <<(*itr).second << endl; } }