#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=2e5+10;
int n,m,a[maxn];
struct node{
int l,r,lazy;
double sum_sin,sum_cos;
} tree[maxn*4];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
inline void triangle(int id,int val){
double change_sin=tree[id].sum_sin*cos(val)+tree[id].sum_cos*sin(val);
tree[id].sum_cos=tree[id].sum_cos*cos(val)-tree[id].sum_sin*sin(val);
tree[id].sum_sin=change_sin;
}
inline void up(int id){
tree[id].sum_cos=tree[id*2].sum_cos+tree[id*2+1].sum_cos;
tree[id].sum_sin=tree[id*2+1].sum_sin+tree[id*2+1].sum_sin;
}
inline void down(int id){
tree[id*2].lazy+=tree[id].lazy;
triangle(id*2,tree[id].lazy);
tree[id*2+1].lazy+=tree[id].lazy;
triangle(id*2+1,tree[id].lazy);
tree[id].lazy=0;
}
inline void build(int id,int l,int r){
tree[id].l=l; tree[id].r=r;
if(l==r){
tree[id].sum_cos=cos(a[l]);
tree[id].sum_sin=sin(a[l]);
return ;
}
int mid=(l+r)/2;
build(id*2,l,mid); build(id*2+1,mid+1,r);
up(id);
}
inline void update(int id,int l,int r,int val){
if(tree[id].l>r||tree[id].r<l) return ;
if(tree[id].l>=l&&tree[id].r<=r){
tree[id].lazy+=val;
triangle(id,val);
return ;
}
if(tree[id].lazy!=0) down(id);
update(id*2,l,r,val); update(id*2+1,l,r,val);
up(id);
}
inline double ask_sum_sin(int id,int l,int r){
if(tree[id].l>r||tree[id].r<l) return 0;
if(tree[id].l>=l&&tree[id].r<=r) return tree[id].sum_sin;
if(tree[id].lazy!=0) down(id);
return (ask_sum_sin(id*2,l,r)+ask_sum_sin(id*2+1,l,r));
}
inline void work(){
n=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,1,n); m=read();
while(m--){
int opt=read(),l=read(),r=read(),val;
if(opt==1) val=read(),update(1,l,r,val);
else cout<<fixed<<setprecision(1)<<ask_sum_sin(1,l,r)<<endl;
}
}
signed main(){work();return 0;}