#include <bits/stdc++.h>
#define int unsigned long long
#define double long double
#define ls(x) ((x) << 1)
#define rs(x) ((x) << 1 | 1)
using namespace std;
const int N = 2e5 + 5;
int n, m;
double sins[N * 4];
double coss[N * 4];
int tag[N];
int a[N];
void pushup(int p) {
sins[p] = sins[ls(p)] + sins[rs(p)];
coss[p] = coss[ls(p)] + coss[rs(p)];
}
void rush(int p, int v) {
double sinv = sin(v), cosv = cos(v);
double tsin = sins[p] * cosv + coss[p] * sinv;
double tcos = coss[p] * cosv - sins[p] * sinv;
sins[p] = tsin;
coss[p] = tcos;
}
void pushdown(int p) {
if (tag[p]) {
tag[ls(p)] += tag[p];
rush(ls(p), tag[p]);
tag[rs(p)] += tag[p];
rush(rs(p), tag[p]);
tag[p] = 0;
}
}
void build(int l, int r, int p) {
if (l == r) {
sins[p] = sin(a[l]);
coss[p] = cos(a[l]);
return ;
}
int mid = l + r >> 1;
build(l, mid, ls(p));
build(mid + 1, r, rs(p));
pushup(p);
}
void update(int l, int r, int x, int y, int v, int p) {
if (x <= l && r <= y) {
rush(p, v);
tag[p] += v;
return ;
}
pushdown(p);
int mid = l + r >> 1;
if (x <= mid) update(l, mid, x, y, v, ls(p));
if (y > mid) update(mid + 1, r, x, y, v, rs(p));
pushup(p);
}
double query(int l, int r, int x, int y, int p) {
if (x <= l && r <= y) {
return sins[p];
}
pushdown(p);
int mid = l + r >> 1;
double res = 0;
if (x <= mid) res += query(l, mid, x, y, ls(p));
if (y > mid) res += query(mid + 1, r, x, y, rs(p));
return res;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
cin >> m;
build(1, n, 1);
while (m--) {
int op, l, r, v;
cin >> op >> l >> r;
if (op == 1) {
cin >> v;
update(1, n, l, r, v, 1);
} else {
cout << fixed << setprecision(1) << query(1, n, l, r, 1) << '\n';
}
}
return 0;
}