#include<bits/stdc++.h>
#define N 500005
using namespace std;
int n,m;
double a[N];
struct node{
int l,r;
double add;
double zsin;
double zcos;
}t[N*4];
void build(int L,int R,int k){
t[k].l=L;
t[k].r=R;
if(L==R){
t[k].zsin=sin(a[L]);
t[k].zcos=cos(a[L]);
return;
}
int mid=(L+R)>>1;
build(L,mid,k<<1);
build(mid+1,R,k<<1|1);
t[k].zsin=t[k<<1].zsin+t[k<<1|1].zsin;
t[k].zcos=t[k<<1].zcos+t[k<<1|1].zcos;
}
//sin(a+b)=sin(a)cos(b)+cos(a)sin(b)
//cos(a+b)=cos(a)cos(b)-sin(a)sin(b)
void down(int k){
double c1=t[k<<1].zsin;
double c2=t[k<<1].zcos;
double C1=t[k<<1|1].zsin;
double C2=t[k<<1|1].zcos;
t[k<<1].zsin+=( cos(t[k].add) * c1 + sin(t[k].add) * c2 );
t[k<<1|1].zsin+=( cos(t[k].add) * C1 + sin(t[k].add) * C2 );
t[k<<1].zcos+=( cos(t[k].add) * c2 - sin(t[k].add) * c1 );
t[k<<1|1].zcos+=( cos(t[k].add) * C2 - sin(t[k].add) * C1);
t[k<<1].add+=t[k].add;
t[k<<1|1].add+=t[k].add;
t[k].add=0;
}
void up(int L,int R,double v,int k){
if(L<=t[k].l&&R>=t[k].r){
double c1=t[k].zsin;
double c2=t[k].zcos;
t[k].zsin=( cos(v) * c1 + sin(v) * c2);//////////////
t[k].zcos=( cos(v) * c2 - sin(v) * c1);
t[k].add+=v;
return;
}
if(t[k].add)down(k);
int mid=(t[k].l+t[k].r)>>1;
if(L<=mid){
up(L,R,v,k<<1);
}
if(R>mid){
up(L,R,v,k<<1|1);
}
t[k].zsin=t[k<<1].zsin+t[k<<1|1].zsin;
t[k].zcos=t[k<<1].zcos+t[k<<1|1].zcos;
}
double ans=0.0;
void ask(int L,int R,int k){
if(L<=t[k].l&&R>=t[k].r){
ans+=t[k].zsin;
return;
}
if(t[k].add)down(k);
int mid=(t[k].l+t[k].r)>>1;
if(L<=mid){
ask(L,R,k<<1);
}
if(R>mid){
ask(L,R,k<<1|1);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
cin>>m;
for(int i=1;i<=m;i++){
int op;
cin>>op;
if(op==1){
int le,ri,val;
cin>>le>>ri>>val;
up(le,ri,val,1);
}
else if(op==2){
int le,ri;
cin>>le>>ri;
ask(le,ri,1);
printf("%.1lf\n",ans);
ans=0;
}
}
return 0;
}