RT
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ldb;
const ll MAXN=2e5+5;
ll n,q,op,x,y,z;
ll a[MAXN];
struct sgm_t{
ldb sin_sum[MAXN<<2],cos_sum[MAXN<<2];
long long tag[MAXN<<2];
void add_tag(ll id,ldb sin_x,ldb cos_x){
ldb sin_a=sin_sum[id],cos_a=cos_sum[id];
sin_sum[id]=sin_a*cos_x+cos_a*sin_x;
cos_sum[id]=cos_a*cos_x-sin_a*sin_x;
return;
}
void push_up(ll id){
sin_sum[id]=sin_sum[id<<1]+sin_sum[id<<1|1];
cos_sum[id]=cos_sum[id<<1]+cos_sum[id<<1|1];
return;
}
void push_down(ll id){
if(!tag[id])return;
ldb sin_x=sin(tag[id]*1.00),cos_x=cos(tag[id]*1.00);
add_tag(id<<1,sin_x,cos_x);
add_tag(id<<1|1,sin_x,cos_x);
tag[id<<1]+=tag[id],tag[id<<1|1]+=tag[id];
tag[id]=0;
return;
}
void build(ll id,ll L,ll R){
if(L>R)return;
if(L==R){
sin_sum[id]=sin(a[L]*1.00);
cos_sum[id]=cos(a[L]*1.00);
return;
}
ll mid=(L+R)>>1;
build(id<<1,L,mid);
build(id<<1|1,mid+1,R);
push_up(id);
return;
}
void update(ll id,ll L,ll R,ll UL,ll UR,ldb delta){
if(L>R||UR<L||R<UL)return;
if(UL<=L&&R<=UR){
add_tag(id,sin(delta*1.00),cos(delta*1.00));
tag[id]+=delta;
return;
}
ll mid=(L+R)>>1;
push_down(id);
if(UL<=mid)update(id<<1,L,mid,UL,UR,delta);
if(UR>mid)update(id<<1|1,mid+1,R,UL,UR,delta);
push_up(id);
return;
}
ldb query(ll id,ll L,ll R,ll QL,ll QR){
if(L>R||QR<L||R<QL)return 0;
if(QL<=L&&R<=QR)return sin_sum[id];
ll mid=(L+R)>>1;
ldb res=0;
push_up(id);
if(QL<=mid)res+=query(id<<1,L,mid,QL,QR);
if(QR>mid)res+=query(id<<1|1,mid+1,R,QL,QR);
return res;
}
}S;
inline void read(ll &x){
x = 0;
char c = getchar();
while(c<'0'||c>'9') c = getchar();
while(c>='0'&&c<='9'){
x = (x<<3)+(x<<1)+(c^48);
c = getchar();
}
}
signed main(){
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
read(n);
for(int i=1;i<=n;i++)read(a[i]);
S.build(1,1,n);
read(q);
for(int i=1;i<=n;i++){
read(op);
if(op==1){
read(x),read(y),read(z);
S.update(1,1,n,x,y,z);
}
else{
read(x),read(y);
printf("%.1lf\n",S.query(1,1,n,x,y));
}
}
return 0;
}
数据太强了/fn