#include<bits/stdc++.h>
#define F(i,x,n) for(int i=x;i<=n;++i)
#define _F(i,x,n) for(int i=x;i>=n;--i)
#define lson x<<1
#define rson x<<1|1
#define int long long
using namespace std;
inline int read(){
int s=0;char c=getchar();bool flag=0;
while(!isdigit(c))flag|=(c=='-'),c=getchar();
while(isdigit(c))s=(s<<3)+(s<<1)+(c^48),c=getchar();
return flag?-s:s;
}
const int N=2e5+5;
struct node{
double sums,sumc;
}t[N<<2];
int a[N],tag[N];
int n,m;
void pushup(int x){
t[x].sums=t[lson].sums+t[rson].sums;
t[x].sumc=t[lson].sumc+t[rson].sumc;
}
void pushdown(int x){
if(!tag[x])return;
double t1=t[lson].sums,t2=t[lson].sumc;
t[lson].sums=t1*cos((double)tag[x])+t2*sin((double)tag[x]),t[lson].sumc=t2*cos((double)tag[x])-t1*sin((double)tag[x]);
t1=t[rson].sums,t2=t[rson].sumc;
t[rson].sums=t1*cos((double)tag[x])+t2*sin((double)tag[x]),t[rson].sumc=t2*cos((double)tag[x])-t1*sin((double)tag[x]);
tag[lson]+=tag[x],tag[rson]+=tag[x],tag[x]=0;
}
void build(int x,int l,int r){
if(l==r){
t[x].sums=sin((double)a[l]),t[x].sumc=cos((double)a[l]);
return;
}
int mid=l+r>>1;
build(lson,l,mid),build(rson,mid+1,r);
pushup(x);
}
void upd(int x,int l,int r,int L,int R,int v){
if(l>R||r<L)return;
if(L<=l&&r<=R){
tag[x]+=v;
double t1=t[x].sums,t2=t[x].sumc;
t[x].sums=t1*cos((double)v)+t2*sin((double)v),t[x].sumc=t2*cos((double)v)-t1*sin((double)v);
return;
}
pushdown(x);
int mid=l+r>>1;
upd(lson,l,mid,L,R,v),upd(rson,mid+1,r,L,R,v);
pushup(x);
}
double qry(int x,int l,int r,int L,int R){
if(l>R||r<L)return 0;
if(L<=l&&r<=R){
return t[x].sums;
}
pushdown(x);
int mid=l+r>>1;
return qry(lson,l,mid,L,R)+qry(rson,mid+1,r,L,R);
}
signed main(){
n=read();
F(i,1,n)a[i]=read();
build(1,1,n);
m=read();
F(i,1,m){
int op=read();
if(op==1){
int l=read(),r=read(),v=read();
upd(1,1,n,l,r,v);
}
else{
int l=read(),r=read();
printf("%.1lf\n",qry(1,1,n,l,r));
}
}
return 0;
}