样例过了,但是全wa
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define bangdeng signed main()
int n,m,op,z,y,a[200010];
struct node
{
int l,r,flag;
double sina,cosa;
} tr[800080];
void pushup(int u)
{
tr[u].sina=tr[u<<1].sina+tr[u<<1|1].sina;
tr[u].cosa=tr[u<<1].cosa+tr[u<<1|1].cosa;
}
void pushdown(int x){
if(tr[x].flag){
int sinx=sin(tr[x<<1].flag),cosx=cos(tr[x<<1|1].flag),cosx1=tr[x<<1].cosa,cosx2=tr[x<<1|1].cosa,sinx1=tr[x<<1].sina,sinx2=tr[x<<1|1].sina;
tr[x<<1].sina=sinx*cosx1+cosx*sinx1;
tr[x<<1].cosa=cosx*cosx1-sinx*sinx1;
tr[x<<1|1].sina=sinx*cosx2+cosx*sinx2;
tr[x<<1|1].cosa=cosx*cosx2-sinx*sinx2;
tr[x<<1].flag+=tr[x].flag;
tr[x<<1|1].flag+=tr[x].flag;
tr[x].flag=0;
}
}
void build(int u,int l,int r)
{
tr[u].l=l,tr[u].r=r;
if(l==r)
{
tr[u].sina=sin(a[l]);
tr[u].cosa=cos(a[l]);
return;
}
int mid=(l+r)/2;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
void update(int u,int l,int r,int x)
{
if(l<=tr[u].l&&r>=tr[u].r){
double sin1=tr[u].sina,cos2=tr[u].cosa,sinc=sin(x),cosc=cos(x);
tr[u].sina=sin1*cosc+cos2*sinc;
tr[u].cosa=cos2*cosc-sin1*sinc;
tr[u].flag+=x;
return;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid) update(u<<1,l,r,x);
if(r>mid) update(u<<1|1,l,r,x);
pushup(u);
}
double q(int u,int l,int r)
{
if(l<=tr[u].l&&r>=tr[u].r) return tr[u].sina;
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
double res=0;
if(l<=mid) res+=q(u<<1,l,r);
if(r>mid) res+=q(u<<1|1,l,r);
return res;
}
bangdeng
{
cin>>n;
for(int i=1;i<=n;i++) scanf("%lld",a+i);
cin>>m;
build(1,1,n);
while(m--)
{
scanf("%lld%lld%lld",&op,&z,&y);
if(op==1){
int k;
scanf("%lld",&k);
update(1,z,y,k);
}
else printf("%.1lf\n",q(1,z,y));
}
}