RE求助
查看原帖
RE求助
241817
Chancylaser楼主2021/8/4 23:24
#include<iostream>
#include<cstdio>
using namespace std;
long long n,m;
long long a[500005];
struct edge{
	long long l,r,lazy,num;
}tree[4000005];
void build(long long p,long long l,long long r){
	tree[p].l=l,tree[p].r=r;
	tree[p].lazy=0;
	if(l==r){
		tree[p].num=a[l];
		return;
	}
	long long mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	tree[p].num=tree[p*2].num+tree[p*2+1].num;
	return;
}
void putdown(long long p){
	tree[p*2].lazy+=tree[p].lazy,tree[p*2+1].lazy+=tree[p].lazy;
	tree[p*2].num+=(tree[p].lazy*(tree[p*2].r-tree[p*2].l+1));
	tree[p*2+1].num+=(tree[p].lazy*(tree[p*2+1].r-tree[p*2+1].l+1));
	tree[p].lazy=0;
	return;
}
void qjj(long long p,long long x,long long y,long long k){
	if(tree[p].lazy!=0) putdown(p);
	if(tree[p].l>=x&&tree[p].r<=y){
		tree[p].lazy+=k;
		tree[p].num+=k*(tree[p].r-tree[p].l+1);
		return;
	}
	long long mid=(tree[p].l+tree[p].r)>>1;
	if(x<=mid&&tree[p].l<=y)
		qjj(p*2,x,y,k);
	if(x<=tree[p].r&&y>mid)
		qjj(p*2+1,x,y,k);
	tree[p].num=tree[p*2].num+tree[p*2+1].num;
	return;
}
void ddh(long long p,long long s){
	if(tree[p].lazy!=0) putdown(p);
	if(tree[p].l==tree[p].r&&tree[p].l==s){
		cout<<tree[p].num<<endl;
	}
	long long mid=(tree[p].l+tree[p].r)>>1;
	if(tree[p].l<=s&&mid>=s){
		ddh(p*2,s);
	}
	if(mid+1<=s&&s<=tree[p].r){
		ddh(p*2+1,s);
	}
}
int main(){
	cin>>n>>m;
	for(long long i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(long long i=1;i<=m;i++){
		char ch;
		cin>>ch;
		if(ch=='1'){
			long long x,y,k;
			cin>>x>>y>>k;
			qjj(1,x,y,k);
		}
		if(ch=='2'){
			long long x;
			cin>>x;
			ddh(1,x);
		}
	}
	return 0;
}

70分,有三个点re,求助

2021/8/4 23:24
加载中...