文件详细信息
本文件的大小为 1583 字节。
#include<cmath>
#include<cstdio>
template<typename T>
void read(T&num){
num=0;
int ch=getchar();
while(ch<48||ch>57)ch=getchar();
while(ch>=48&&ch<=57)num=(num<<3)+(num<<1)+(ch^48),ch=getchar();
}
typedef long long ll;
typedef double real;
const int maxn=200005;
int n,a[maxn],m,op,ql,qr,v;
real sinv,cosv;
struct Seg{
real s,c;
ll tag;
}T[maxn<<2];
void pushup(int u){
T[u]=Seg{T[u<<1].s+T[u<<1|1].s,T[u<<1].c+T[u<<1|1].c,0};
}
void pushdown(int u){
if(!T[u].tag)return;
const real _s=sin(T[u].tag),_c=cos(T[u].tag);
const int l=u<<1,r=u<<1|1;
T[l]=Seg{T[l].s*_c+T[l].c*_s,T[l].c*_c-T[l].s*_s,T[l].tag+T[u].tag};
T[r]=Seg{T[r].s*_c+T[r].c*_s,T[r].c*_c-T[r].s*_s,T[r].tag+T[u].tag};
T[u].tag=0;
}
void build(int u,int l,int r){
if(l==r){
T[u]=Seg{sin(a[l]),cos(a[l]),0};
return;
}
int m=(l+r)>>1;
build(u<<1,l,m);
build(u<<1|1,m+1,r);
pushup(u);
}
void modify(int u,int l,int r){
if(ql<=l&&r<=qr){
T[u]=Seg{T[u].s*cosv+T[u].c*sinv,T[u].c*cosv-T[u].s*sinv,T[u].tag+v};
return;
}
pushdown(u);
int m=(l+r)>>1;
if(ql<=m)modify(u<<1,l,m);
if(qr>m)modify(u<<1|1,m+1,r);
pushup(u);
}
real query(int u,int l,int r){
if(ql<=l&&r<=qr)return T[u].s;
pushdown(u);
int m=(l+r)>>1;
if(qr<=m)return query(u<<1,l,m);
if(ql>m)return query(u<<1|1,m+1,r);
return query(u<<1,l,m)+query(u<<1|1,m+1,r);
}
int main(){
read(n);
for(int i=1;i<=n;i++)read(a[i]);
build(1,1,n);
read(m);
for(int i=1;i<=m;i++){
read(op),read(ql),read(qr);
if(op==1){
read(v);
sinv=sin(v),cosv=cos(v);
modify(1,1,n);
}else printf("%.1f\n",query(1,1,n));
}
return 0;
}