#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; #define fi first #define se second #define mp make_pair #define mt make_tuple #define pqueue priority_queue const int inf=1e9+7; const ll mod=1e9+7; const ll mod1=998244353; const ll big=1e18; const long double PI=2*asin(1); struct SegmentTree { vector > Tree[20]; void init() { for(int i=0;i<20;++i) Tree[i].resize((1<(Tree[pos1][pos2])==0) return; long double x, y, theta, tmp; if(pos1+1<20) { x = get<0>(Tree[pos1+1][2*pos2]); y = get<1>(Tree[pos1+1][2*pos2]); theta = get<2>(Tree[pos1+1][2*pos2]); Tree[pos1+1][2*pos2] = mt(x, y, theta+get<2>(Tree[pos1][pos2])); x = get<0>(Tree[pos1+1][2*pos2+1]); y = get<1>(Tree[pos1+1][2*pos2+1]); theta = get<2>(Tree[pos1+1][2*pos2+1]); Tree[pos1+1][2*pos2+1] = mt(x, y, theta+get<2>(Tree[pos1][pos2])); } x = get<0>(Tree[pos1][pos2]); y = get<1>(Tree[pos1][pos2]); tmp = atan(y/x); theta = get<2>(Tree[pos1][pos2]); long double length = sqrt(x*x+y*y); x = length*cos(theta+tmp); y = length*sin(theta+tmp); theta = 0; Tree[pos1][pos2] = mt(x, y, theta); return; } void update(int index, long double x, long double y) { Tree[19][index] = mt(x, y, 0); index /= 2; long double x1, y1, x2, y2; for(int i=18;i>=0;--i) { x1 = get<0>(Tree[i+1][2*index]); y1 = get<1>(Tree[i+1][2*index]); x2 = get<0>(Tree[i+1][2*index+1]); y2 = get<1>(Tree[i+1][2*index+1]); Tree[i][index] = mt(x1+x2, y1+y2, 0); index /= 2; } return; } void thetaupdate(int ql, int qr, long double theta, int pos1=0, int pos2=0, int sl=0, int sr=(1<<19)) { eval(pos1, pos2); if(sr<=ql || qr<=sl) return; if(ql<=sl && sr<=qr) { long double x, y, tmp; x = get<0>(Tree[pos1][pos2]); y = get<1>(Tree[pos1][pos2]); tmp = get<2>(Tree[pos1][pos2]); tmp += theta; Tree[pos1][pos2] = mt(x, y, tmp); eval(pos1, pos2); return; } thetaupdate(ql, qr, theta, pos1+1, 2*pos2, sl, (sl+sr)/2); thetaupdate(ql, qr, theta, pos1+1, 2*pos2+1, (sl+sr)/2, sr); long double x1, x2, y1, y2, tmptheta; x1 = get<0>(Tree[pos1+1][2*pos2]); y1 = get<1>(Tree[pos1+1][2*pos2]); x2 = get<0>(Tree[pos1+1][2*pos2+1]); y2 = get<1>(Tree[pos1+1][2*pos2+1]); tmptheta = get<2>(Tree[pos1][pos2]); Tree[pos1][pos2] = mt(x1+x2, y1+y2, tmptheta); return; } void lengthupdate(int index, long double length) { long double x, y, tmp, theta; x = get<0>(Tree[19][index]); y = get<1>(Tree[19][index]); theta = get<2>(Tree[19][index]); tmp = sqrtl(x*x+y*y); x *= length/tmp; y *= length/tmp; Tree[19][index] = mt(x, y, theta); index /= 2; long double x1, x2, y1, y2; for(int i=18;i>=0;--i) { x1 = get<0>(Tree[i+1][2*index]); y1 = get<1>(Tree[i+1][2*index]); x2 = get<0>(Tree[i+1][2*index+1]); y2 = get<1>(Tree[i+1][2*index+1]); theta = get<2>(Tree[i][index]); Tree[i][index] = mt(x1+x2, y1+y2, theta); index /= 2; } return; } pair getans(int ql, int qr, int pos1=0, int pos2=0, int sl=0, int sr=(1<<19)) { eval(pos1, pos2); if(sr<=ql || qr<=sl) return mp(0, 0); if(ql<=sl && sr<=qr) return mp(get<0>(Tree[pos1][pos2]), get<1>(Tree[pos1][pos2])); pair ans1, ans2; ans1 = getans(ql, qr, pos1+1, 2*pos2, sl, (sl+sr)/2); ans2 = getans(ql, qr, pos1+1, 2*pos2+1, (sl+sr)/2, sr); return mp(ans1.fi+ans2.fi, ans1.se+ans2.se); } void check() { for(int i=16;i<20;++i) { for(int j=0;j<(1<<(i-16));++j) { cout<<"("<(Tree[i][j])<<","<(Tree[i][j])<<" "<(Tree[i][j])<<") "; } cout<>N>>Q; SegmentTree tree; tree.init(); for(int i=0;i > ans; pair state; long double xx, yy; long double length; for(int i=0;i>query; if(query==0) { cin>>index>>x; index--; tree.thetaupdate(index, N, x*PI/180); } else if(query==1) { cin>>index>>x; index--; tree.lengthupdate(index, x); } else { cin>>index; ans.push_back(tree.getans(0, index)); } //tree.check(); } for(int i=0;i