#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
using llt=long long;
constexpr int maxn=200010;
struct node{
int l,r;
llt lazy;
double sin,cos;
};
int n,m;
int datas[maxn];
node tree[4*maxn];
int ll(int i){
return i*2;
}
int rr(int i){
return i*2+1;
}
void pushup(int i){
tree[i].sin=tree[ll(i)].sin+tree[rr(i)].sin;
tree[i].cos=tree[ll(i)].cos+tree[rr(i)].cos;
}
void pd_impl(int i,int k){
tree[i].lazy+=k;
double sine=tree[i].sin,cosine=tree[i].cos;
tree[i].sin=sine*cos(k)+cosine*sin(k);
tree[i].cos=cosine*cos(k)-sine*sin(k);
}
void pushdown(int i){
pd_impl(ll(i),tree[i].lazy);
pd_impl(rr(i),tree[i].lazy);
tree[i].lazy=0;
}
void build(int i,int l,int r){
tree[i].l=l;
tree[i].r=r;
if(l==r){
tree[i].sin=sin(datas[l]);
tree[i].cos=cos(datas[l]);
return;
}
int mid=(l+r)/2;
build(ll(i),l,mid);
build(rr(i),mid+1,r);
pushup(i);
}
void add(int i,int l,int r,int k){
if(tree[i].r<=r&&tree[i].l>=l){
pd_impl(i,k);
return;
}
if(tree[i].lazy){
pushdown(i);
}
if(tree[ll(i)].r>=l){
add(ll(i),l,r,k);
}
if(tree[rr(i)].l<=r){
add(rr(i),l,r,k);
}
pushup(i);
}
double query(int i,int l,int r){
if(tree[i].r<=r&&tree[i].l>=l){
return tree[i].sin;
}
if(tree[i].lazy){
pushdown(i);
}
double t=0;
if(tree[ll(i)].r>=l){
t+=query(ll(i),l,r);
}
if(tree[rr(i)].l<=r){
t+=query(rr(i),l,r);
}
return t;
}
int main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;++i){
cin>>datas[i];
}
build(1,1,n);
cin>>m;
for(int i=1;i<=m;++i){
int op,l,r;
cin>>op>>l>>r;
if(op==1){
int k;
cin>>k;
add(1,l,r,k);
}else{
cout<<fixed<<setprecision(1)<<query(1,l,r)<<"\n";
}
}
}
求大佬指点