#define _GNU_SOURCE #include #include #include #define MAXS 10240 struct seg { unsigned len; int deg_angle; }; static struct seg seg[MAXS]; size_t num_seg; struct tree { struct tree *left, *right; struct seg *seg; long double len; long double rad_relangle; }; static struct tree tree[2 * MAXS]; static size_t num_tree; static void recompute (struct tree *t) { if (t->seg != NULL) t->rad_relangle = (t->seg->deg_angle - 180) * (M_PIl / 180); else { long double x, y; x = t->left->len + t->right->len * cosl (t->right->rad_relangle); y = t->right->len * sinl (t->right->rad_relangle); t->len = hypotl (x, y); t->rad_relangle = t->left->rad_relangle + atan2l(y, x); } } static struct tree * build_tree (size_t start, size_t num) { struct tree *t; t = tree + num_tree++; if (num == 1) { t->left = NULL; t->right = NULL; t->seg = seg + start; t->len = seg[start].len; } else { t->left = build_tree (start, num / 2); t->right = build_tree (start + num / 2, num - num / 2); t->seg = NULL; } recompute (t); return t; } static void update_tree (struct tree *t, size_t num, size_t i) { if (num > 1) { if (i < num / 2) update_tree (t->left, num / 2, i); else update_tree (t->right, num - num / 2, i - num / 2); } recompute (t); } int main (void) { unsigned c; int first; first = 1; while (scanf ("%zu%u", &num_seg, &c) == 2) { size_t i; struct tree *root; for (i = 0; i < num_seg; i++) { scanf ("%u", &seg[i].len); seg[i].deg_angle = 180; } num_tree = 0; root = build_tree (0, num_seg); if (first != 0) first = 0; else putchar ('\n'); while (c != 0) { unsigned s, a; c--; scanf ("%u%u", &s, &a); seg[s].deg_angle = a; update_tree (root, num_seg, s); printf ("%.2Lf %.2Lf\n", root->len * cosl (root->rad_relangle + M_PIl / 2), root->len * sinl (root->rad_relangle + M_PIl / 2)); } } return EXIT_SUCCESS; }