RE on #5求助
查看原帖
RE on #5求助
200044
JS_TZ_ZHR楼主2022/2/17 07:19

用的set+BIT,不知道哪里错了/kel

#include<bits/stdc++.h>
#define int long long
#define N 2000005
#define lowbit(k) k&(-k)
#define IT set<node>::iterator
using namespace std;
int n,m,x,y,z,t[N],tag[N];
char opt[N];
struct node {
	int l,r;
	mutable int val;
	node(int L, int R=-1, int Val=0):l(L), r(R), val(Val) {}
	bool operator<(const node& o) const {
		return l < o.l;
	}
};
set<node>s;
void add(int p,int k){
   // if(n==999361)return;
	if(p<=0)return;
	while(p<=n){
		t[p]+=k; 
		p+=lowbit(p);
	}
	return;
}
int query(int p){
   // if(n==999361)return 0;
	int res=0;
	while(p){
		res+=t[p];
		p-=lowbit(p);
	}
	return res;
}
IT spilt(int pos) {
//	if(n==999361)return s.begin();
	IT it=s.lower_bound(node(pos));
	if(it!=s.end()&&it->l==pos)return it;
	it--;
	int L=it->l,R=it->r;
	int Val=it->val;
	s.erase(it);
	s.insert(node(L,pos-1,Val));
	return s.insert(node(pos,R,Val)).first;
}
void assign(int l,int r,int V) {
//	if(n==999361)return;
	IT pl=spilt(l),pr=spilt(r+1);
	for(;pl!=pr;pl++)add(pl->r+1,-tag[pl->val]+tag[V]),add(pl->l,tag[pl->val]-tag[V]);
	pl=spilt(l),pr=spilt(r+1);
	s.erase(pl,pr);
	s.insert(node(l,r,V));
}
int q(int p){
	
//	if(n==999361)return 0;
	IT it=s.lower_bound(node(p));
	if(it!=s.end()&&it->l<=p&&it->r>=p)return it->val;
	it--;
	return it->val;
}
signed main() {
	scanf("%lld%lld",&n,&m); 
	s.insert(node(1,n,1));
	s.insert(node(n+1,n+1,n+1));
	for(int i=1;i<=m;i++){
		scanf("%s",opt);
		if(opt[0]=='A') {
			scanf("%lld%lld",&x,&y);
			tag[x]+=y;
		}
		else if(opt[0]=='C'){
			scanf("%lld%lld%lld",&x,&y,&z);
			assign(x,y,z);
		}
		else{
			scanf("%lld",&x);
			printf("%lld\n",query(x)+tag[q(x)]);
		}
	}
}
2022/2/17 07:19
加载中...