#include<bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef long long LL;
const int N=2e5+10;
struct tree
{
int l,r;double s,c;LL tg;
}tr[4*N];
int a[N];
int n,m;
double sinx,cosx;
void pushup(int p)
{
tr[p].s=tr[ls].s+tr[rs].s;
tr[p].c=tr[ls].c+tr[rs].c;
}
void update(int p,double a2,double b2)
{
double a1=tr[p].s,b1=tr[p].c;
tr[p].c=b1*b2-a1*a1;
tr[p].s=a1*b2+b2*a1;
}
void pushdown(int p)
{
LL k=tr[p].tg;
if(tr[p].tg==0) return;
if(k!=0)
{
tr[ls].tg+=k;
tr[rs].tg+=k;
double a2=sin(k),b2=cos(k);
update(ls,a2,b2),update(rs,a2,b2);
tr[p].tg=0;
}
}
void build(int p,int l,int r)
{
tr[p]={l,r};
if(l==r)
{
tr[p].s=sin(a[l]),tr[p].c=cos(a[l]);
return;
}
int mid=l+r>>1;
build(ls,l,mid),build(rs,mid+1,r);
pushup(p);
}
void change(int p,int x,int y,int k)
{
if(x<=tr[p].l&&tr[p].r<=y)
{
tr[p].tg+=k;
update(p,sinx,cosx);
return;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(x<=mid) change(ls,x,y,k);
if(y>mid) change(rs,x,y,k);
pushup(p);
}
double q(int p,int x,int y)
{
if(x<=tr[p].l&&tr[p].r<=y) return tr[p].s;
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
double res=0;
if(x<=mid) res=q(ls,x,y);
if(y>mid) res+=q(rs,x,y);
return res;
}
int main()
{
scanf("%d", &n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
scanf("%d", &m);
while(m--)
{
int x,l1,r1;
scanf("%d%d%d", &x, &l1, &r1);
if(x==1)
{
int v;
scanf("%d",&v);
sinx=sin(v),cosx=cos(v);
change(1,l1,r1,v);
}
else if(x==2)
{
printf("%.1lf\n",q(1,l1,r1));
}
}
return 0;
}