#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int a[200010];
struct node{
int l,r;
double sin_sum,cos_sum;
ll add;
}t[200010*4];
void pushup(int u){
t[u].sin_sum=t[u*2].sin_sum+t[u*2+1].sin_sum;
t[u].cos_sum=t[u*2].cos_sum+t[u*2+1].cos_sum;
}
void pushdown(int u){
if(t[u].add){
t[u*2].add+=t[u].add;
t[u*2+1].add+=t[u].add;
double res=t[u*2].sin_sum;
t[u*2].sin_sum=t[u*2].sin_sum*cos(t[u].add)+t[u*2].cos_sum*sin(t[u].add);
t[u*2].cos_sum=t[u*2].cos_sum*cos(t[u].add)-res*sin(t[u].add);
res=t[u*2+1].sin_sum;
t[u*2+1].sin_sum=t[u*2+1].sin_sum*cos(t[u].add)+t[u*2+1].cos_sum*sin(t[u].add);
t[u*2+1].cos_sum=t[u*2+1].cos_sum*cos(t[u].add)-res*sin(t[u].add);
t[u].add=0;
}
}
void build(int u,int l,int r){
t[u]={l,r};
if(l==r){
t[u].sin_sum=sin(a[l]);
t[u].cos_sum=cos(a[l]);
return;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
void update(int u,int l,int r,int x){
if(t[u].l>=l&&t[u].r<=r){
t[u].add+=x;
double res=t[u].sin_sum;
t[u].sin_sum=t[u].sin_sum*cos(x)+t[u].cos_sum*sin(x);
t[u].cos_sum=t[u].cos_sum*cos(x)-res*sin(x);
return;
}
pushdown(u);
int mid=(t[u].l+t[u].r)/2;
if(l<=mid)update(u*2,l,r,x);
if(r>mid)update(u*2+1,l,r,x);
pushup(u);
}
node query(int u,int l,int r){
if(t[u].l>=l&&t[u].r<=r)return t[u];
pushdown(u);
int mid=(t[u].l+t[u].r)/2;
node res;
if(l<=mid)res=query(u*2,l,r);
if(r>mid){
node res1=query(u*2+1,l,r);
res.sin_sum=res.sin_sum+res1.sin_sum;
res.cos_sum=res.cos_sum+res1.cos_sum;
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int m;
cin>>m;
build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int l,r,x;
cin>>l>>r>>x;
update(1,l,r,x);
}
else{
int l,r;
cin>>l>>r;
printf("%.1lf\n",query(1,l,r).sin_sum);
}
}
return 0;
}