#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e5 + 10;
int n, m;
struct node {
int l, r, dat;
double Sin, Cos;
long long lst;
}tr[N * 4];
int a[N];
void pushup(int &p) {
node &left = tr[p * 2], &right = tr[p * 2 + 1];
tr[p].dat = left.dat + right.dat;
tr[p].Sin = left.Sin + right.Sin;
tr[p].Cos = left.Cos + right.Cos;
}
void pushdown(node &p, node &left, node &right) {
if(!p.lst) return ;
left.lst += p.lst, right.lst += p.lst;
p.dat += (p.r - p.l + 1) * p.lst;
double Sin = p.Sin, Cos = p.Cos;
p.Sin = cos(p.lst) * Sin + sin(p.lst) * Cos;
p.Cos = cos(p.lst) * Cos - sin(p.lst) * Sin;
p.lst = 0;
}
void pushdown(int &p) {
pushdown(tr[p], tr[p * 2], tr[p * 2 + 1]);
}
void build(int p, int l, int r) {
if(l == r) tr[p] = {l, r, a[l], sin(a[l]), cos(a[l])};
else {
tr[p].l = l, tr[p].r = r;
int mid = l + r >> 1;
build(p * 2, l, mid);
build(p * 2 + 1, mid + 1, r);
pushup(p);
}
}
void change(int p, int l, int r, long long v) {
if(tr[p].l >= l && tr[p].r <= r) {
tr[p].lst += v;
double sina = sin(v);
double cosa = cos(v);
double Sin = tr[p].Sin, Cos = tr[p].Cos;
tr[p].Sin = cosa * Sin + sina * Cos;
tr[p].Cos = cosa * Cos - sina * Sin;
return ;
} else {
pushdown(p);
int mid = tr[p].l + tr[p].r >> 1;
if(mid >= l) change(p * 2, l, r, v);
if(mid < r) change(p * 2 + 1, l, r, v);
pushup(p);
}
}
double query(int p, int l, int r) {
if(tr[p].l >= l && tr[p].r <= r) return tr[p].Sin;
pushdown(p);
int mid = tr[p].l + tr[p].r >> 1;
double sum = 0;
if(mid >= l) sum += query(p * 2, l, r);
if(mid < r) sum += query(p * 2 + 1, l, r);
return sum;
}
signed main() {
cin >> n;
for(int i = 1; i <= n; i ++) {
cin >> a[i];
}
build(1, 1, n);
cin >> m;
while(m --) {
int op;
scanf("%lld", &op);
if(op == 1) {
int l, r, v;
scanf("%lld%lld%lld", &l, &r, &v);
change(1, l, r, v);
} else {
int l, r;
scanf("%lld%lld", &l, &r);
printf("%.1lf\n", query(1, l, r));
}
}
return 0;
}```