#include<bits/stdc++.h>
#define foir(i,l,r) for (register int i=l;i<=r;++i)
#define fopr(i,l,r) for (register int i=l;i>=r;--i)
#define maxn 200010
using namespace std;
/*
sin(a+x)=sina*cosx+cosa*sinx
cos(a+x)=cosa*cosx-sina*sinx
*/
long long n,m,opt;
long long l,r,k;
inline long long read()
{
long long x=0;bool f=0;char c=getchar();
while (!isdigit(c)) f|=c=='-',c=getchar();
while (isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return f?-x:x;
}
struct Segment_tree
{
double s[maxn<<2],c[maxn<<2];
long long tag[maxn<<2];
inline void pushup(long long p)
{
s[p]=s[p<<1]+s[p<<1|1];
c[p]=c[p<<1]+c[p<<1|1];
}
inline void check(long long p)
{
double S=s[p],C=c[p],x=tag[p];
s[p]=S*cos(x)+C*sin(x);
c[p]=C*cos(x)-S*sin(x);
}
inline void pushdown(long long p)
{
if (!tag[p]) return ;
tag[p<<1]+=tag[p];
check(p<<1);
tag[p<<1|1]+=tag[p];
check(p<<1|1);
tag[p]=0;
}
inline void update(long long L,long long R,long long ql,long long qr,long long x,long long p)
{
// cout<<L<<" "<<R<<endl;
if (L>=ql&&qr>=R)
{
// cout<<"giao\n";
double S=s[p],C=c[p];
s[p]=S*cos(x)+C*sin(x);
c[p]=C*cos(x)-S*sin(x);
tag[p]+=x;
return ;
}
long long mid=(L+R)>>1;
pushdown(p);
if (ql<=mid) update(L,mid,ql,qr,x,p<<1);
if (qr>mid) update(mid+1,R,ql,qr,x,p<<1|1);
pushup(p);
}
double query(long long L,long long R,long long ql,long long qr,long long p)
{
if (L>=ql&&R<=qr)
return s[p];
pushdown(p);
long long mid=(L+R)>>1;
double res=0;
if (ql<=mid) res+=query(L,mid,ql,qr,p<<1);
if (qr>mid) res+=query(mid+1,R,ql,qr,p<<1|1);
return res;
}
inline void build(long long L,long long R,long long p)
{
if (L==R)
{
long long x=read();
s[p]=sin(x);
c[p]=cos(x);
return ;
}
long long mid=(L+R)>>1;
build(L,mid,p<<1);
build(mid+1,R,p<<1|1);
pushup(p);
}
}seg;
int main()
{
n=read();
seg.build(1,n,1);
m=read();
while (m--)
{
opt=read();
if (opt==1)
{
l=read(),r=read(),k=read();
seg.update(1,n,l,r,k,1);
}
else
{
l=read(),r=read();
cout<<fixed<<setprecision(1)<<seg.query(1,n,l,r,1)<<endl;
}
}
return 0;
}
样例过了,找了好久bug都没找到,求调