#include<iostream>
#include<cmath>
#include<cstdio>
#include<iomanip>
#define int long long
using namespace std;
#define maxn 200001
#define lson i<<1
#define rson i<<1|1
#define Pi 3.1415926
struct node{
int l,r,sum;
double sinx,cosx;
//维护左边界 右边界 区间sin cos和
int lazy;
}tree[maxn<<2];
int n,m;
int a[maxn];//开int也可
void Build(int i,int l,int r){
//建树
tree[i].l=l,tree[i].r=r;
if (l==r){
// tree[i].sum=a[l];
tree[i].sinx=sin(a[l]);
//若达到叶子节点 更新sin值
tree[i].cosx=cos(a[l]);
return;
}
int mid=(l+r)/2;
Build(lson,l,mid);
Build(rson,mid+1,r);
// tree[i].sum =tree[lson].sum+tree[rson].sum;
tree[i].sinx=tree[lson].sinx+tree[rson].sinx;
tree[i].cosx=tree[lson].cosx+tree[rson].cosx;
}
void PushDown(int i){
if (tree[i].lazy){
//这里的lazy就相当于x辣
int lazy=tree[i].lazy;
double y =tree[lson].sinx;
double y2=tree[rson].sinx;
double z =tree[lson].cosx;
double z2=tree[rson].cosx;
tree[lson].sinx=sin(lazy)*z+cos(lazy)*y;
tree[rson].sinx=sin(lazy)*z2+cos(lazy)*y2;
tree[lson].cosx=cos(lazy)*z-sin(lazy)*y;
tree[rson].cosx=cos(lazy)*z2-sin(lazy)*y2;
tree[lson].lazy+=lazy;
tree[rson].lazy+=lazy;
tree[i].lazy=0;
}
}
void Update(int i,int l,int r,double v){
//将l~r区间分别加上v (v就相当于上面的x)
if (tree[i].l>=l&&tree[i].r<=r){
// tree[i].sum+=v*(tree[i].r-tree[i].l+1);
tree[i].lazy+=v;
//懒惰标记
double y=tree[i].sinx;
double z=tree[i].cosx;
tree[i].sinx=sin(v)*z+cos(v)*y;
tree[i].cosx=cos(v)*z-sin(v)*y;
//证明的过程在最上面QAQ
return; //记得返回
}
// PushDown(i);
int mid=(tree[i].l+tree[i].r)/2;
if (l<=mid) Update(lson,l,r,v);
if (r>mid) Update(rson,l,r,v);
// tree[i].sum=tree[lson].sum+tree[rson].sum;
tree[i].sinx=tree[lson].sinx+tree[rson].sinx;
tree[i].cosx=tree[lson].cosx+tree[rson].cosx;
}
double Query(int i,int l,int r){
if (tree[i].l>=l&&tree[i].r<=r){
return tree[i].sinx;
}
PushDown(i);
double val=0;
int mid=(tree[i].l+tree[i].r)/2;
if (l<=mid){
// cout<<lson <<"aa\n";
val+=Query(lson,l,r);
}
if (r>mid){
// cout<<(rson)<<"bb\n";
val+=Query(rson,l,r);
}
return val;
}
signed main(){
// int a;cin>>a;
// double b=sin(a);
// cout<<fixed<<setprecision(1)<<b;
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
Build(1,1,n);
cin>>m;
int op,l,r;
double v;
for (int in=1;in<=m;in++){
cin>>op>>l>>r;
if (op==1){
cin>>v;
Update(1,l,r,v);
}
if (op==2){
double ans=Query(1,l,r);
cout<<fixed<<setprecision(1)<<ans<<endl;
}
}
return 0;
}
rt,样例过了,自己造了几组数据和tj的输出也是一样的,但是全WA,求助dalao