#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int n,m;
int a[N];
namespace qwq{
int ch[N<<2][2],lzy[N<<2];
double sin[N<<2],cos[N<<2];
inline void push_up(int u){
sin[u]=sin[ch[u][0]]+sin[ch[u][1]];
cos[u]=cos[ch[u][0]]+cos[ch[u][1]];
}
inline void build_tree(int u,int l,int r){
if(l==r){
sin[u]=std::sin(a[l]);
cos[u]=std::cos(a[l]);
return;
}
ch[u][0]=u<<1,ch[u][1]=u<<1|1;
int m=l+r>>1;
build_tree(ch[u][0],l,m);
build_tree(ch[u][1],m+1,r);
push_up(u);
}
inline void f(int u,int x){
int _=sin[u],__=cos[u];
sin[u]=sin[u]*std::cos(x)+cos[u]*std::sin(x);
cos[u]=__*std::cos(x)-_*std::sin(x);
lzy[u]+=x;
}
inline void push_down(int u){
if(!lzy[u]) return;
f(ch[u][0],lzy[u]);
f(ch[u][1],lzy[u]);
lzy[u]=0;
}
inline void update(int u,int l,int r,int L,int R,int x){
if(L<=l&&r<=R){
f(u,x);
return;
}
push_down(u);
int m=l+r>>1;
if(L<=m) update(ch[u][0],l,m,L,R,x);
if(R>m) update(ch[u][1],m+1,r,L,R,x);
push_up(u);
}
inline double query(int u,int l,int r,int L,int R){
if(L<=l&&r<=R) return sin[u];
push_down(u);
double tmp=0;
int m=l+r>>1;
if(L<=m) tmp+=query(ch[u][0],l,m,L,R);
if(R>m) tmp+=query(ch[u][1],m+1,r,L,R);
return tmp;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>m;
qwq::build_tree(1,1,n);
while(m--){
int opt;
cin>>opt;
if(opt==1){
int l,r,x;
cin>>l>>r>>x;
qwq::update(1,1,n,l,r,x);
}
if(opt==2){
int l,r;
cin>>l>>r;
printf("%.1lf\n",qwq::query(1,1,n,l,r));
}
}
return 0;
}