#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n;
int a[N];
double sinv,cosv;
struct st{
double tsin[N<<2],tcos[N<<2];
long long tag[N<<2];
void push_up (int p)
{
tsin[p]=tsin[p<<1|1]+tsin[p<<1];
tcos[p]=tcos[p<<1|1]+tcos[p<<1];
}
void build (int l,int r,int p)
{
if(l==r)
{
tsin[p]=sin(a[l]);
tcos[p]=cos(a[l]);
return ;
}
int mid=(l+r)>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
push_up(p);
}
void sdown (int p,double sinp,double cosp,int k)
{
tsin[p]=tcos[p]*sinp+tsin[p]*cosp;
tcos[p]=tcos[p]*cosp-tsin[p]*sinp;
tag[p]+=k;
}
void push_down (int u)
{
if(abs(tag[u]-0)<0.000001) return ;
sdown(u<<1,sin(tag[u]),cos(tag[u]),tag[u]);
sdown(u<<1|1,sin(tag[u]),cos(tag[u]),tag[u]);
tag[u]=0;
}
void update (int l,int r,int pl,int pr,int p,int k)
{
if(pl<=l&&r<=pr)
{
sdown(p,sinv,cosv,k);
return ;
}
int mid=(l+r)>>1;
push_down(p);
if(pl<=mid) update(1,mid,pl,pr,p<<1,k);
if(pr>mid) update(mid+1,r,pl,pr,p<<1|1,k);
push_up(p);
}
double query (int l,int r,int pl,int pr,int p)
{
double res=0.0;
if(pl<=l&&r<=pr) return tsin[p];//cout<<"@";
int mid=(l+r)>>1;//cout<<p<<" "<<l<<" "<<mid<<" "<<r<<" "<<pl<<" "<<pr<<" "<<endl;
push_down(p);
if(pl<=mid) res+=query(l,mid,pl,pr,p<<1);
if(pr>mid) res+=query(mid+1,r,pl,pr,p<<1|1);
return res;
}
}T;
signed main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
T.build(1,n,1);
int m;
scanf("%d",&m);
while(m--)
{
int op;
cin>>op;
if(op==1)
{
int l,r,v;
scanf("%lld%lld%lld",&l,&r,&v);
sinv=sin(v),cosv=cos(v);
//cout<<sinv<<" "<<cosv<<endl;
T.update(1,n,l,r,1,v);
}
else
{
int l,r;
scanf("%lld%lld",&l,&r);
printf("%.1f\n",T.query(1,n,l,r,1));
// for(int i=1;i<=n*4;i++)
// cout<<T.tsin[i]<<" ";
// puts("");
}
}
return 0;
}
define int long long应该没事吧