查了一晚上了不知道哪里手欠出错了(
马蜂较为奇怪请各位大佬见谅。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cstring>
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
#define Heriko return
#define Deltana 0
#define Romanno 1
#define S signed
#define LL long long
#define R register
#define I inline
#define CI const int
#define mst(a, b) memset(a, b, sizeof(a))
#define ON std::ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
template<typename J>
I void fr(J &x)
{
short f(1);
char c=getchar();
x=0;
while(c<'0' or c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while (c>='0' and c<='9')
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
x*=f;
}
CI MXX=2e5+5;
double sv,cv;
struct SegTree
{
double s[MXX<<2],c[MXX<<2];
LL tag[MXX<<2];
I void Pushsc(int x,double sx,double cx)
{
s[x]=s[x]*cx+c[x]*sx;
c[x]=c[x]*cx-s[x]*sx;
}
I void Pushup(int x)
{
s[x]=s[lc(x)]+s[rc(x)];
c[x]=c[lc(x)]+c[rc(x)];
}
I void Pushdown(int x)
{
if(!tag[x]) Heriko;
double sx=sin(tag[x]),cx=cos(tag[x]);
Pushsc(lc(x),sx,cx);
Pushsc(rc(x),sx,cx);
tag[lc(x)]+=tag[x];
tag[rc(x)]+=tag[x];
tag[x]=0;
}
void Build(int x,int l,int r)
{
if(l==r)
{
int a;fr(a);
s[x]=sin(a),c[x]=cos(a);
Heriko;
}
int mid=(l+r)>>1;
Build(lc(x),l,mid);
Build(rc(x),mid+1,r);
Pushup(x);
}
void Modify(int x,int l,int r,int sl,int sr,int v)
{
if(sl<=l and r<=sr)
{
Pushsc(x,sv,cv);
tag[x]+=v;
Heriko;
}
Pushdown(x);
int mid=(l+r)>>1;
if(sl<=mid) Modify(lc(x),l,mid,sl,sr,v);
if(sr>mid) Modify(rc(x),mid+1,r,sl,sr,v);
Pushup(x);
}
double Query(int x,int l,int r,int sl,int sr)
{
if(sl<=l and r<=sr) Heriko s[x];
Pushdown(x);
double res=0.00;
int mid=(l+r)>>1;
if(sl<=mid) res+=Query(lc(x),l,mid,sl,sr);
if(sr>mid) res+=Query(rc(x),mid+1,r,sl,sr);
Heriko res;
}
}
SegmentTree;
int n,m,opt,x,y,z;
S main()
{
fr(n);
SegmentTree.Build(1,1,n);
fr(m);
while(m--)
{
fr(opt),fr(x),fr(y);
if(opt==1)
{
fr(z);
sv=sin(z),cv=cos(z);
SegmentTree.Modify(1,1,n,x,y,z);
}
else printf("%.1lf\n",SegmentTree.Query(1,1,n,x,y));
}
Heriko Deltana;
}