#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
struct node{
int l,r;
double sine,cosi;
int add=0;
}tr[N*4];
LL a[N];
int n,m,k,ll,rr;
double func(double t){
return t=(int(t*100+5))/100.0;
}
void pushup(int u){
auto &rt=tr[u],&ls=tr[u<<1],&rs=tr[u<<1|1];
rt.sine=ls.sine+rs.sine;
rt.cosi=ls.cosi+ls.cosi;
}
void pushdown(int u){
auto &rt=tr[u],&ls=tr[u<<1],&rs=tr[u<<1|1];
if(rt.add==0)return;
double sx=sin(rt.add),cx=cos(rt.add);
double lss=ls.sine,lsc=ls.cosi,rss=rs.sine,rsc=rs.cosi;
ls.sine=lss*cx+lsc*sx;
ls.cosi=lsc*cx-lss*sx;
rs.sine=rss*cx+rsc*sx;
rs.cosi=rsc*cx-rss*sx;
rs.add+=rt.add;
ls.add+=rt.add;
rt.add=0;
}
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r;
if(l==r){
tr[u].sine=sin(a[l]);
tr[u].cosi=cos(a[l]);
return;
}
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void modify(int u,int l,int r,LL ad){
if(tr[u].l>=l&&tr[u].r<=r){
double cx=cos(ad),sx=sin(ad);
double ts=tr[u].sine,tc=tr[u].cosi;
tr[u].sine=ts*cx+tc*sx;
tr[u].cosi=tc*cx-ts*sx;
tr[u].add+=ad;
return;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid)modify(u<<1,l,r,ad);
if(r>mid) modify(u<<1|1,l,r,ad);
pushup(u);
return;
}
double query1(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r)return tr[u].sine;
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(r<=mid)return query1(u<<1,l,r);
if(l>mid)return query1(u<<1|1,l,r);
else return query1(u<<1,l,r)+query1(u<<1|1,l,r);
}
int main(){
cout<<fixed<<setprecision(1);
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
LL t;
cin>>m;
while(m--){
cin>>k>>ll>>rr;
if(k==1){
cin>>t;
modify(1,ll,rr,t);
}
else{
cout<<query1(1,ll,rr)<<'\n';
}
}
return 0;
}