文件详细信息

下载本文件

本文件的大小为 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;
}