#include<bits/stdc++.h>
using namespace std;
#define db double
const int maxn=2e5+10;
struct node{
int l,r,tag;
db cossum,sinsum;
}tree[maxn*4];
int n;
int a[maxn];
int opt,l,r,val;
int q;
void upd(int id,int val) {
db si=tree[id].sinsum,co=tree[id].cossum;
tree[id].sinsum=cos(val)*si+sin(val)*co;
tree[id].cossum=cos(val)*co-sin(val)*si;
}
void pushup(int id) {
tree[id].cossum=tree[id*2].cossum+tree[id*2+1].cossum;
tree[id].sinsum=tree[id*2].sinsum+tree[id*2+1].sinsum;
}
void pushdown(int id) {
upd(id*2,tree[id].tag),upd(id*2+1,tree[id].tag);
tree[id].tag=0;
}
void build(int id,int l,int r) {
tree[id].l=l,tree[id].r=r;
tree[id].tag=tree[id].cossum=tree[id].sinsum=0;
if(l==r) {
tree[id].sinsum=sin(a[l]);
tree[id].cossum=cos(a[l]);
return;
}
int mid=(l+r)/2;
build(id*2,l,mid),build(id*2+1,mid+1,r);
pushup(id);
}
void update(int id,int l,int r,int val) {
if(tree[id].l>r || tree[id].r<l) return;
if(tree[id].l>=l && tree[id].r<=r) {
upd(id,val);
return;
}
pushdown(id);
update(id*2,l,r,val),update(id*2+1,l,r,val);
pushup(id);
}
db query(int id,int l,int r) {
if(tree[id].l>r || tree[id].r<l) return 0;
if(tree[id].l>=l && tree[id].r<=r) {
return tree[id].sinsum;
}
pushdown(id);
return query(id*2,l,r)+query(id*2+1,l,r);
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
cin>>q;
while(q--) {
cin>>opt>>l>>r;
if(opt==1) {
cin>>val;
update(1,l,r,val);
}else cout<<fixed<<setprecision(1)<<query(1,l,r)<<endl;
}
return 0;
}