#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define llint long long #define double long double #define PI 3.1415926535897932384626433832795028841971 #define inf 1e18 #define rep(x, s, t) for(llint (x) = (s); (x) < (t); (x)++) #define Rep(x, s, t) for(llint (x) = (s); (x) <= (t); (x)++) #define chmin(x, y) (x) = min((x), (y)) #define chmax(x, y) (x) = max((x), (y)) using namespace std; typedef pair P; // range-add, range-min query P sum(P &a, P &b) { return P(a.first+b.first, a.second+b.second); } P rot(P &p, double a) { return P(p.first*cos(a) - p.second*sin(a), p.first*sin(a) + p.second*cos(a)); } struct LazySegTree{ int size; vector

seg; vector delay; LazySegTree(){} LazySegTree(int size){ this->size = size; seg.resize(1<<(size+1)); delay.resize(1<<(size+1)); } void init() { for(int i = 0; i < (1<<(size+1)); i++){ seg[i] = P(0, 0); delay[i] = 0; } } void eval(int l, int r, int k) { if(fabs(delay[k]) > 1e-9){ seg[k] = rot(seg[k], delay[k]); if(l < r){ delay[k*2] += delay[k]; delay[k*2+1] += delay[k]; } delay[k] = 0; } } void update(int i, P val) { int l = 0, r = (1<= 0; j--){ k <<= 1; if(i & (1< 1){ i /= 2; seg[i] = sum(seg[i*2], seg[i*2+1]); } } void add(int a, int b, int k, int l, int r, double val) { eval(l, r, k); if(b < l || r < a) return; if(a <= l && r <= b){ delay[k] += val; eval(l, r, k); return; } add(a, b, k*2, l, (l+r)/2, val); add(a, b, k*2+1, (l+r)/2+1, r, val); seg[k] = sum(seg[k*2], seg[k*2+1]); } void add(int a, int b, double val){ if(a > b) return; add(a, b, 1, 0, (1<> n >> Q; seg.init(); for(int i = 1; i <= n; i++){ d[i] = 1, ang[i] = 0; seg.update(i, P(1, 0)); } llint t, id, x; for(int i = 1; i <= Q; i++){ cin >> t; if(t == 0){ cin >> id >> x; double a = x * PI / 180; seg.add(id, n, a - ang[id]); ang[id] = a; } if(t == 1){ cin >> id >> x; P res = seg.query(id, id); res.first *= x / d[id], res.second *= x / d[id]; seg.update(id, res); d[id] = x; } if(t == 2){ cin >> id; P res = seg.query(1, id); printf("%.11Lf %.11Lf\n", res.first, res.second); } } return 0; }