样例过了,改了几次都是wa,麻烦大佬帮忙看看
#include<bits/stdc++.h>
#define ll long long
#define dl double
#define lp (p<<1)
#define rp (p<<1|1)
#define mid ((l+r)>>1)
using namespace std;
inline ll read(){
ll w=1,s=0;char ch=getchar();
while(ch<'0'||ch>'9') w=(ch=='-'?-1:1),ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return w*s;
}
const int nn = 2e5+10;
struct tree{
dl cs,sn;
ll tag;
}t[nn<<2];
ll a[nn],n,m,op;
inline void up (ll p){
t[p].sn=t[lp].sn+t[rp].sn;
t[p].cs=t[lp].cs+t[rp].cs;
return;
}
void build(ll p,ll l,ll r){
if(l==r){
t[p].sn=sin(a[l]);
t[p].cs=cos(a[l]);
t[p].tag=0;
return;
}
build(lp,l,mid);
build(rp,mid+1,r);
up(p);
}
inline void push_down(ll p){
if(t[p].tag==0) return;
dl x=t[p].sn,y=t[p].cs;
t[p].sn=1.0*x*cos(t[p].tag)+1.0*y*sin(t[p].tag);
t[p].cs=1.0*y*cos(t[p].tag)-1.0*x*sin(t[p].tag);
t[lp].tag+=t[p].tag;
t[rp].tag+=t[p].tag;
t[p].tag=0;
return;
}
void modify(ll p,ll l,ll r,ll L,ll R,ll v){
if(L<=l&&r<=R){
t[p].tag+=v;
dl x=t[p].sn,y=t[p].cs;
t[p].sn=x*cos(v)+y*sin(v);
t[p].cs=y*cos(v)-x*sin(v);
return;
}
push_down(p);
if(mid>=L) modify(lp,l,mid,L,R,v);
if(mid<R) modify(rp,mid+1,r,L,R,v);
up(p);
return;
}
dl query(ll p,ll l,ll r,ll L,ll R){
if(L<=l&&r<=R) return t[p].sn;
dl res=0;
push_down(p);
if(L<=mid) res+=query(lp,l,mid,L,R);
if(mid<R) res+=query(rp,mid+1,r,L,R);
up(p);
return res;
}
ll x,y,v;
int main(){
n=read();
for(int i=1;i<=n;i++) a[i]=read();
build(1,1,n);
m=read();
while(m--){
op=read();x=read();y=read();
if(op==1){
v=read();
modify(1,1,n,x,y,v);
}
else{
dl ans = query(1,1,n,x,y);
// printf("%.1f\n",work(ans));
printf("%.1f\n",ans);
}
}
return 0;
}