#include<bits/stdc++.h>
using namespace std;
const int N=2e5+50;
#define updatenode(rt,sinx,cosx)do{double sina=tr[x].sin,cosa=tr[x].cos;tr[x].sin=sina*cosx+cosa*sinx;tr[x].cos=cosa*cosx-sina*sinx;}while(0);
#define pushup(x) do{tr[x].sin=tr[x<<1].sin+tr[x<<1|1].sin;tr[x].cos=tr[x<<1].cos+tr[x<<1|1].cos;}while(0);
#define pushdown(x) do{if(!tr[x].tag)break;double Sin=sin(tr[x].tag),Cos=cos(tr[x].tag);updatenode(x<<1,Sin,Cos);updatenode(x<<1|1,Sin,Cos);tr[x<<1].tag+=tr[x].tag;tr[x<<1|1].tag+=tr[x].tag;tr[x].tag=0;}while(0);
struct node {
double sin,cos;
int a,tag;
} tr[N*4];
int n,a[N],m;
double Sinx,Cosx;
void build(int x,int l,int r) {
if(l==r) {
tr[x].a=a[l];
tr[x].cos=cos(a[l]);
tr[x].sin=sin(a[l]);
return ;
}
pushdown(x);
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
void update(int x,int l,int r,int L,int R,int k) {
if(L<=l && r<=R) {
updatenode(x,Sinx,Cosx);
tr[x].tag+=k;
return ;
}
int mid=(l+r)>>1;
pushdown(x);
if(L<=mid)update(x<<1,l,mid,L,mid,k);
if(R>mid)update(x<<1|1,mid+1,r,mid+1,R,k);
pushup(x);
}
double query(int x,int l,int r,int L,int R) {
if(L<=l && r<=R) {
return tr[x].sin;
}
int mid=(l+r)>>1;
pushdown(x);
double res=0;
if(L<=mid)res+=query(x<<1,l,mid,L,mid);
if(R>mid)res+=query(x<<1|1,mid+1,r,mid+1,R);
pushup(x);
return res;
}
int main() {
cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
build(1,1,n);
cin>>m;
while(m--) {
int opt,l,r;
cin>>opt>>l>>r;
if(opt==1) {
int v;
cin>>v;
Sinx=sin(v);
Cosx=cos(v);
update(1,1,n,l,r,v);
} else {
printf("%.1lf\n",query(1,1,n,l,r));
}
}
return 0;
}