#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
const int N = 2e5 + 5;
double a[N];
struct node{
int l, r;
double tag;
double sum_sin, sum_cos;
}tree[N << 2];
void pushup(int k){
int lc = k * 2;
int rc = k * 2 + 1;
tree[k].sum_sin = tree[lc].sum_sin + tree[rc].sum_sin;
tree[k].sum_cos = tree[lc].sum_cos + tree[rc].sum_cos;
}
void add_tag(int k, double v){
int ssin = tree[k].sum_sin;
int scos = tree[k].sum_cos;
tree[k].tag += v;
tree[k].sum_sin = cos(v) * ssin + sin(v) * scos;
tree[k].sum_cos = cos(v) * scos - sin(v) * ssin;
}
void pushdown(int k){
int lc = k * 2;
int rc = k * 2 + 1;
add_tag(lc, tree[k].tag);
add_tag(rc, tree[k].tag);
tree[k].tag = 0;
}
void build(int k, int l, int r){
tree[k].l = l;
tree[k].r = r;
if(l == r){
tree[k].sum_sin = sin(a[l]);
tree[k].sum_cos = cos(a[l]);
return;
}
int mid = (l + r) >> 1;
int lc = k * 2;
int rc = k * 2 + 1;
build(lc, l, mid);
build(rc, mid + 1, r);
pushup(k);
}
void modify(int k, int l, int r, double v){
if(tree[k].l >= l && tree[k].r <= r){
add_tag(k, v);
return;
}
pushdown(k);
int mid = (tree[k].l + tree[k].r) >> 1;
int lc = k * 2;
int rc = k * 2 + 1;
if(r <= mid) modify(lc, l, r, v);
else if(l > mid) modify(rc, l, r, v);
else modify(lc, l, mid, v), modify(rc, mid + 1, r, v);
pushup(k);
}
double query(int k, int l, int r){
if(tree[k].l >= l && tree[k].r <= r) return tree[k].sum_sin;
pushdown(k);
int mid = (tree[k].l + tree[k].r) >> 1;
int lc = k * 2;
int rc = k * 2 + 1;
if(r <= mid) return query(lc, l, r);
else if(l > mid) return query(rc, l, r);
else return query(lc, l, mid) + query(rc, mid + 1, r);
}
void solve(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cout << fixed << setprecision(1);
int n;
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
build(1, 1, n);
int m;
cin >> m;
for(int i = 1; i <= m; i++){
int op, l, r;
cin >> op >> l >> r;
if(op == 1){
double v;
cin >> v;
modify(1, l, r, v);
}else{
cout << query(1, l, r) << '\n';
}
}
}
int main(){
int t = 1;
while(t--){
solve();
}
return 0;
}