#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; int a[200010]; struct node{ int l,r; double sin_sum,cos_sum; ll add; }t[2000104]; void pushup(int u){ t[u].sin_sum=t[u2].sin_sum+t[u2+1].sin_sum; t[u].cos_sum=t[u2].cos_sum+t[u2+1].cos_sum; } void pushdown(int u){ if(t[u].add){ t[u2].add+=t[u].add; t[u2+1].add+=t[u].add; double res=t[u2].sin_sum; t[u2].sin_sum=t[u2].sin_sumcos(t[u].add)+t[u2].cos_sumsin(t[u].add); t[u2].cos_sum=t[u2].cos_sumcos(t[u].add)-ressin(t[u].add); res=t[u2+1].sin_sum; t[u2+1].sin_sum=t[u2+1].sin_sumcos(t[u].add)+t[u2+1].cos_sumsin(t[u].add); t[u2+1].cos_sum=t[u2+1].cos_sumcos(t[u].add)-ressin(t[u].add); t[u].add=0; } } void build(int u,int l,int r){ t[u]={l,r}; if(l==r){ t[u].sin_sum=sin(a[l]); t[u].cos_sum=cos(a[l]); return; } int mid=(l+r)/2; build(u2,l,mid); build(u2+1,mid+1,r); pushup(u); } void update(int u,int l,int r,int x){ if(t[u].l>=l&&t[u].r<=r){ t[u].add+=x; double res=t[u].sin_sum; t[u].sin_sum=t[u].sin_sumcos(x)+t[u].cos_sumsin(x); t[u].cos_sum=t[u].cos_sumcos(x)-ressin(x); return; } pushdown(u); int mid=(t[u].l+t[u].r)/2; if(l<=mid)update(u2,l,r,x); if(r>mid)update(u2+1,l,r,x); pushup(u); } node query(int u,int l,int r){ if(t[u].l>=l&&t[u].r<=r)return t[u]; pushdown(u); int mid=(t[u].l+t[u].r)/2; node res; if(l<=mid)res=query(u2,l,r); if(r>mid){ node res1=query(u*2+1,l,r); res.sin_sum=res.sin_sum+res1.sin_sum; res.cos_sum=res.cos_sum+res1.cos_sum; } return res; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; int m; cin>>m; build(1,1,n); while(m--){ int op; cin>>op; if(op==1){ int l,r,x; cin>>l>>r>>x; update(1,l,r,x); } else{ int l,r; cin>>l>>r; printf("%.1lf\n",query(1,l,r).sin_sum); } } return 0; }
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int a[200010];
struct node{
int l,r;
double sin_sum,cos_sum;
ll add;
}t[200010*4];
void pushup(int u){
t[u].sin_sum=t[u*2].sin_sum+t[u*2+1].sin_sum;
t[u].cos_sum=t[u*2].cos_sum+t[u*2+1].cos_sum;
}
void pushdown(int u){
if(t[u].add){
t[u*2].add+=t[u].add;
t[u*2+1].add+=t[u].add;
double res=t[u*2].sin_sum;
t[u*2].sin_sum=t[u*2].sin_sum*cos(t[u].add)+t[u*2].cos_sum*sin(t[u].add);
t[u*2].cos_sum=t[u*2].cos_sum*cos(t[u].add)-res*sin(t[u].add);
res=t[u*2+1].sin_sum;
t[u*2+1].sin_sum=t[u*2+1].sin_sum*cos(t[u].add)+t[u*2+1].cos_sum*sin(t[u].add);
t[u*2+1].cos_sum=t[u*2+1].cos_sum*cos(t[u].add)-res*sin(t[u].add);
t[u].add=0;
}
}
void build(int u,int l,int r){
t[u]={l,r};
if(l==r){
t[u].sin_sum=sin(a[l]);
t[u].cos_sum=cos(a[l]);
return;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
void update(int u,int l,int r,int x){
if(t[u].l>=l&&t[u].r<=r){
t[u].add+=x;
double res=t[u].sin_sum;
t[u].sin_sum=t[u].sin_sum*cos(x)+t[u].cos_sum*sin(x);
t[u].cos_sum=t[u].cos_sum*cos(x)-res*sin(x);
return;
}
pushdown(u);
int mid=(t[u].l+t[u].r)/2;
if(l<=mid)update(u*2,l,r,x);
if(r>mid)update(u*2+1,l,r,x);
pushup(u);
}
node query(int u,int l,int r){
if(t[u].l>=l&&t[u].r<=r)return t[u];
pushdown(u);
int mid=(t[u].l+t[u].r)/2;
node res;
if(l<=mid)res=query(u*2,l,r);
if(r>mid){
node res1=query(u*2+1,l,r);
res.sin_sum=res.sin_sum+res1.sin_sum;
res.cos_sum=res.cos_sum+res1.cos_sum;
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int m;
cin>>m;
build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int l,r,x;
cin>>l>>r>>x;
update(1,l,r,x);
}
else{
int l,r;
cin>>l>>r;
printf("%.1lf\n",query(1,l,r).sin_sum);
}
}
return 0;
}