0pts求助
查看原帖
0pts求助
777965
c_y_y楼主2024/3/13 12:55

全wa

#include<bits/stdc++.h>
using namespace std;
inline long long read(){
	long long x=0;
	int f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
	return x*f;
}
const int N=400010;
int a[N];
struct node{
	long long sum,tagk,tagd;
}tree[N];
void build(int rt,int l,int r){
	if(l==r){
		tree[rt].sum=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
void pushdown(int rt,int l,int r,int x){
	int mid=l+r>>1;
	tree[rt<<1].tagk+=tree[rt].tagk;
	tree[rt<<1].tagd+=tree[rt].tagd;
	tree[rt<<1].sum+=(2*tree[rt].tagk+(l+mid-2*x)*tree[rt].tagd)*(mid-l+1)/2;
	tree[rt<<1|1].tagk+=tree[rt].tagk;
	tree[rt<<1|1].tagd+=tree[rt].tagd;
	tree[rt<<1|1].sum+=(2*tree[rt].tagk+(r+mid+1-2*x)*tree[rt].tagd)*(r-mid)/2;
	tree[rt].tagk=tree[rt].tagd=0; 
}
void modify(int rt,int l,int r,int x,int y,long long k,long long d){
	//ai=k+(i-l)*d
	//sumL,R=(2*k+(L+R-2*l)*d)*(R-L+1)/2
	if(x<=l&&r<=y){
		tree[rt].tagk+=k;
		tree[rt].tagd+=d;
		tree[rt].sum+=(2*k+(l+r-2*x)*d)*(r-l+1)/2;
		return ;
	}
	if(tree[rt].tagk!=0||tree[rt].tagd!=0) pushdown(rt,l,r,x);
	int mid=l+r>>1;
	if(x<=mid) modify(rt<<1,l,mid,x,y,k,d);
	if(y>mid) modify(rt<<1|1,mid+1,r,x,y,k,d);
	tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
long long query(int rt,int l,int r,int x,int y){
	if(x<=l&&r<=y)return tree[rt].sum;
	if(tree[rt].tagk!=0||tree[rt].tagd!=0) pushdown(rt,l,r,x);
	int mid=l+r>>1;
	long long det=0;
	if(x<=mid) det+=query(rt<<1,l,mid,x,y);
	if(y>mid) det+=query(rt<<1|1,mid+1,r,x,y);
	return det;
}
int main(){
//	freopen("P1438_1.in","r",stdin);
	cout.tie(0);
	int n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	while(m--){
		int op=read();
		if(op==1){
			int x=read(),y=read();
			long long k=read(),d=read();
			modify(1,1,n,x,y,k,d);
		} 
		else {
			int x=read();
			cout<<query(1,1,n,x,x)<<"\n";
		}
	}
	return 0;
}
2024/3/13 12:55
加载中...