#include<bits/stdc++.h>
using namespace std;
const int N = 3e5;
int n;
int a[N];
int m;
double sv,cv;
struct tree{
long long l,r,lazy;
double sinsum,cossum;
}tr[N << 3];
void update(int p,double sc,double cc){
double sp = tr[p].sinsum;
double cp = tr[p].cossum;
tr[p].sinsum = sp * cc + cp * sc;
tr[p].cossum = cp * cc - sp * sc;
}
void build(int l,int r,int p){
tr[p].l = l;
tr[p].r = r;
if(l != r){
int mid = (l + r) / 2;
build(l,mid,p * 2);
build(mid + 1,r,p * 2 + 1);
tr[p].sinsum = tr[p * 2].sinsum + tr[p * 2 + 1].sinsum;
tr[p].cossum = tr[p * 2].cossum + tr[p * 2 + 1].cossum;
}
else{
tr[p].sinsum = sin(a[l]);
tr[p].cossum = cos(a[r]);
}
}
void lazy_down(int p){
long long la = tr[p].lazy;
if(!la){
return;
}
double sla = sin(la);
double cla = cos(la);
update(p * 2,sla,cla);
tr[p * 2].lazy += la;
update(p * 2 + 1,sla,cla);
tr[p * 2 + 1].lazy += la;
la = 0;
}
void add(int p,int l,int r,int x){
if(tr[p].l > r || tr[p].r < l){
return;
}
if(tr[p].l >= l && tr[p].r <= r){
update(p,sv,cv);
tr[p].lazy += x;
return;
}
lazy_down(p);
add(p * 2,l,r,x);
add(p * 2 + 1,l,r,x);
tr[p].sinsum = tr[p * 2].sinsum + tr[p * 2 + 1].sinsum;
tr[p].cossum = tr[p * 2].cossum + tr[p * 2 + 1].cossum;
}
double query(int p,int l,int r){
if(l <= tr[p].l && r >= tr[p].r){
return tr[p].sinsum;
}
if(tr[p].l > r || tr[p].r < l){
return 0;
}
lazy_down(p);
return query(p * 2,l,r) + query(p * 2 + 1,l,r);
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin >> n;
for(int i = 1 ; i <= n ; i++){
cin >> a[i];
}
build(1,n,1);
cin >> m;
while(m--){
int op,l,r,v;
cin >> op;
if(op == 1){
cin >> l >> r >> v;
sv = sin(v);
cv = cos(v);
add(1,l,r,v);
}
else{
cin >> l >> r;
printf("%.1lf\n", query(1, l, r));
}
}
return 0;
}