#include<cstdio>
#include<cmath>
#define Starseven main
#define ll long long
#define mid (l + r >> 1)
#define ls (id << 1)
#define rs (id << 1 | 1)
#define check (x <= l && y >= r)
namespace lyt {
void read(int &x){
char ch=getchar();int re=0,op=1;
while(ch<'0'||ch>'9'){if(ch=='-') op=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){re=(re<<3)+(re<<1)+ch-'0';ch=getchar();}
x = re * op;
return ;
}
void read(long long &x){
char ch=getchar();long long re=0,op=1;
while(ch<'0'||ch>'9'){if(ch=='-') op=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){re=(re<<3ll)+(re<<1ll)+ch-'0';ch=getchar();}
x = re * op;
return ;
}
void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
return ;
}//记得自己加空格和换行
void write(long long x){
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
return ;
}//记得自己加空格和换行
int max(int x,int y){return x<y?y:x;}
int min(int x,int y){return x<y?x:y;}
int abs(int x){return x<0?-x:x;}
long long max(long long x,long long y){return x<y?y:x;}
long long min(long long x,long long y){return x<y?x:y;}
long long abs(long long x){return x<0?-x:x;}
double abs(double x){return x<0?-x:x;}
void swap(int &a,int &b) {a ^= b ^= a ^= b;}
void swap(long long &a,long long &b) {a ^= b ^= a ^= b;}
ll Power(ll a, ll b, ll p) {
ll re = 1;
while(b) {
if(b & 1ll) re = (re * a) % p;
b >>= 1ll;
a = (a * a) % p;
}
return re;
}
}using namespace lyt;
const int N = 2e5 + 20;
int n, m, a[N];
struct node{
double Sin, Cos;
int tag;
}tr[N << 2];
struct nod {
void Pushup(int id) {
tr[id].Sin = tr[ls].Sin + tr[rs].Sin;
tr[id].Cos = tr[ls].Cos + tr[rs].Cos;
return ;
}
void Pushdown(int id) {
if(!tr[id].tag) return ;
int k = tr[id].tag;
tr[id].tag = 0;
double S = tr[ls].Sin, C = tr[ls].Cos;
double s = sin(k), c = cos(k);
tr[ls].Sin = (S * c + C * s);
tr[ls].Cos = (C * c - S * s);
tr[ls].tag += k;
S = tr[rs].Sin, C = tr[rs].Cos;
tr[rs].Sin = (S * c + C * s);
tr[rs].Cos = (C * c - S * s);
tr[rs].tag += k;
return ;
}
void Build_tree(int l, int r,int id) {
if(l == r) {
tr[id].Sin = sin(a[l]);
tr[id].Cos = cos(a[l]);
tr[id].tag = 0;
return ;
}
Build_tree(l, mid, ls);
Build_tree(mid + 1, r, rs);
Pushup(id);
}
void Insert(int l, int r, int x, int y, int id, int k) {
if(check) {
double S = tr[id].Sin, C = tr[id].Cos;
double s = sin(k), c = cos(k);
tr[id].Sin = (S * c + C * s);
tr[id].Cos = (C * c - S * s);
tr[id].tag += k;
return ;
}
Pushdown(id);
if(x <= mid) Insert(l, mid, x, y, ls, k);
if(y > mid) Insert(mid + 1, r, x, y, rs, k);
Pushup(id);
return ;
}
double Find(int l, int r, int x, int y, int id) {
if(check) return tr[id].Sin;
Pushdown(id);
double re = 0.0;
if(x <= mid) re += Find(l, mid, x, y, ls);
if(y > mid) re += Find(mid + 1, r, x, y, rs);
return re;
}
}solve;
int Starseven(void) {
read(n);
for (int i = 1; i <= n; i++)
read(a[i]);
read(m);
solve.Build_tree(1, n, 1);
while(m--) {
int opt, x, y;
read(opt);
read(x);
read(y);
if(opt == 1) {
int v;
read(v);
solve.Insert(1, n, x, y, 1, v);
}
else {
double ans = solve.Find(1, n, x, y, 1);
printf("%.1lf\n", ans);
}
}
return 0;
}