写吐了,ll开了,历史版本存了,其他错误也都找了,就是过不去
#include <iostream>
#include <cmath>
using namespace std;
#define int long long
#define MAX_N 200010
int n,m;
double a[MAX_N],sina[MAX_N * 4],cosa[MAX_N * 4],mark[MAX_N * 4];
void pushup(int k){
sina[k] = sina[k << 1] + sina[k << 1 | 1];
cosa[k] = cosa[k << 1] + cosa[k << 1 | 1];
return;
}
void build(int l,int r,int k){
if(l == r){
sina[k] = sin(a[l]);
cosa[k] = cos(a[l]);
return;
}
int mid = l + ((r - l) >> 1);
build(l,mid,k << 1);
build(mid + 1,r,k << 1 | 1);
pushup(k);
}
void pushdown(int l,int r,int k){
sina[k << 1] = cos(mark[k]) * sina[k << 1] + sin(mark[k]) * cosa[k << 1];
cosa[k << 1] = cos(mark[k]) * cosa[k << 1] - sin(mark[k]) * sina[k << 1];
sina[k << 1 | 1] = cos(mark[k]) * sina[k << 1 | 1] + sin(mark[k]) * cosa[k << 1 | 1];
cosa[k << 1 | 1] = cos(mark[k]) * cosa[k << 1 | 1] - sin(mark[k]) * sina[k << 1 | 1];
mark[k << 1] += mark[k];
mark[k << 1 | 1] += mark[k];
mark[k] = 0;
}
void updata(int L,int R,int l,int r,int k,int v){
if(L <= l && R >= r){
double sa = sina[k],ca = cosa[k];
sina[k] = cos(v) * sa + sin(v) * ca;
cosa[k] = cos(v) * ca - sin(v) * sa;
mark[k] += v;
return;
}
pushdown(l,r,k);
int mid = l + ((r - l) >> 1);
if(L <= mid)updata(L,R,l,mid,k << 1,v);
if(R > mid)updata(L,R,mid + 1,r,k << 1 | 1,v);
pushup(k);
}
double query(int L,int R,int l,int r,int k){
if(L <= l && R >= r) return sina[k];
pushdown(l,r,k);
int mid = l + ((r - l) >> 1);
double res = 0;
if(L <= mid)res += query(L,R,l,mid,k << 1);
if(R > mid)res += query(L,R,mid + 1,r,k << 1 | 1);
return res;
}
signed main(){
cin >> n;
for(int i = 1;i <= n;i++)cin >> a[i];
build(1,n,1);
cin >> m;
while(m--){
int opt,l,r,v;
cin >> opt >> l >> r;
if(opt == 1){
cin >> v;
updata(l,r,1,n,1,v);
}
else{
printf("%.1lf \n",query(l,r,1,n,1));
}
}
return 0;
}