#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10000;
#define reg register
typedef long long ll;
typedef unsigned long long ull;
inline ll read()
{
char c=getchar();ll x=0,f=1;
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
struct node{
ll l,r;
ll la;
double ssum,csum;
}t[10*N];
ll m,n;
ll a[N];
void up(ll u)
{
t[u].ssum=t[u<<1].ssum+t[(u<<1)+1].ssum;
t[u].csum=t[u<<1].csum+t[(u<<1)+1].csum;
}
void down(ll u)
{
if(t[u].la==0) return;
ll mid=(t[u].l+t[u].r)>>1;
t[u<<1].la+=t[u].la;
t[(u<<1)+1].la+=t[u].la;
double ssum1=t[u<<1].ssum,csum1=t[u<<1].csum;
double ssum2=t[(u<<1)+1].ssum,csum2=t[(u<<1)+1].csum;
t[u<<1].ssum=cos(t[u].la)*ssum1+sin(t[u].la)*csum1;
t[u<<1].csum=cos(t[u].la)*csum1-sin(t[u].la)*ssum1;
t[(u<<1)+1].ssum=cos(t[u].la)*ssum2+sin(t[u].la)*csum2;
t[(u<<1)+1].csum=cos(t[u].la)*csum2-sin(t[u].la)*ssum2;
t[u].la=0;
return;
}
void build(ll u,ll l,ll r)
{
if(l==r)
{
t[u].l=l;
t[u].r=r;
t[u].la=0;
t[u].ssum=sin(a[l]);
t[u].csum=cos(a[l]);
return;
}
t[u].l=l;
t[u].r=r;
ll mid=(l+r)>>1;
build(u<<1,l,mid);
build((u<<1)+1,mid+1,r);
up(u);
}
void add(ll u,ll x,ll y,ll z)
{
if(x<=t[u].l&&y>=t[u].r)
{
double ssum1=t[u].ssum,csum1=t[u].csum;
t[u].la+=z;
t[u].ssum=cos(t[u].la)*ssum1+sin(t[u].la)*csum1;
t[u].csum=cos(t[u].la)*csum1-sin(t[u].la)*ssum1;
return;
//cosb*sum(sina)+sinb*sum(cosa)
//cosb*sum(cosa)-sinb*sum(sina)
}
ll mid=(t[u].l+t[u].r)>>1;
if(x<=mid) add(u<<1,x,y,z);
if(y>mid) add((u<<1)+1,x,y,z);
down(u);
up(u);
return;
}
double q(ll u,ll x,ll y)
{
if(x<=t[u].l&&y>=t[u].r)
return t[u].ssum;
down(u);
ll mid=(t[u].l+t[u].r)>>1;
double ans=0;
if(x<=mid)
ans+=q(u<<1,x,y);
if(y>mid)
ans+=q((u<<1)+1,x,y);
return ans;
}
int main()
{
// memset(,0,sizeof );
n=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
build(1,1,n);
m=read();
int k=0,l,r,v;
for(int i=1;i<=m;i++)
{
k=read();
if(k==1)
{
l=read();
r=read();
v=read();
add(1,l,r,v);
}
if(k==2)
{
l=read();
r=read();
printf("%.1lf\n",q(1,l,r));
}
}
return 0;
}
维护的sin、cos的和