#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10;
int a[maxn];
int l,r,op;
struct tree
{
int l,r;
double s;
double c;
int lzy;
}tr[maxn<<2];
void pushup(int p)
{
tr[p].s=tr[p<<1].s+tr[p<<1|1].s;
tr[p].c=tr[p<<1].c+tr[p<<1|1].c;
}
void build(int p,int l,int r)
{
tr[p].l=l;
tr[p].r=r;
tr[p].lzy=0;
if(l==r)
{
tr[p].s=sin(a[l]);
tr[p].c=cos(a[l]);
return ;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
void update(int p,double sina,double cosa)
{
double sinu=tr[p].s;
double cosu=tr[p].c;
tr[p].s=sinu*cosa+cosu*sina;
tr[p].c=cosu*cosa-sina*sinu;
}
void pushdown(int p)
{
if(tr[p].lzy)
{
double sina=sin(tr[p].lzy);
double cosa=cos(tr[p].lzy);
update(p<<1,sina,cosa);
update(p<<1|1,sina,cosa);
tr[p<<1].lzy+=tr[p].lzy;
tr[p<<1|1].lzy+=tr[p].lzy;
tr[p].lzy=0;
}
}
void modify(int p,int l,int r,int k)
{
if(tr[p].l>=l&&tr[p].r<=r)
{
tr[p].lzy+=k;
double sina=sin(k);
double cosa=cos(k);
update(p,sina,cosa);
return ;
}
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
if(l<=mid) modify(p<<1,l,r,k);
if(r>mid) modify(p<<1|1,l,r,k);
pushup(p);
}
void modify1(int p,int k,int x)
{
if(tr[p].l==tr[p].r)
{
tr[p].lzy+=x;
double sina=sin(x);
double cosa=cos(x);
update(p,sina,cosa);
return ;
}
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
if(k<=mid) modify1(p<<1,k,x);
else modify1(p<<1|1,k,x);
pushup(p);
}
double query(int p,int l,int r)
{
if(tr[p].l>=l&&tr[p].r<=r) return tr[p].s;
int mid=(tr[p].l+tr[p].r)>>1;
double res=0;
if(l<=mid) res+=query(p<<1,l,r);
if(r>mid) res+=query(p<<1|1,l,r);
return res;
}
double query1(int p,int k)
{
if(tr[p].l==tr[p].r) return tr[p].s;
int mid=tr[p].l+tr[p].r>>1;
double res=0;
if(k<=mid) res=query1(p<<1,k);
else res=query1(p<<1|1,k);
return res;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n,m;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
cin>>m;
while(m--)
{
cin>>op>>l>>r;
if(op==1)
{
int k;
cin>>k;
if(l==r) modify1(1,l,k);
else modify(1,l,r,k);
}
else
{
if(l==r) printf("%.1f\n",query1(1,l));
else printf("%.1f\n",query(1,l,r));
}
}
return 0;
}