0tps求调
查看原帖
0tps求调
847021
__zhang__楼主2024/6/9 06:53

线段树写的,大佬帮帮忙

#include<bits/stdc++.h>
#define L_s (node*2)
#define R_s (node*2+1)
using namespace std;
const int Maxn=0xfff;
int a[4*Maxn];
struct m{
	int sum,pl;
};
bool cmp(m a,m b){
	if(a.sum==b.sum)return a.pl<b.pl;
	return a.sum>b.sum;
}
struct megment_tree{
	int lazy,sum,l,r;
}tree[Maxn*4];
inline void pushup(int node){
	tree[node].sum=tree[L_s].sum+tree[R_s].sum;
}
inline void build(int l,int r,int node){
	tree[node].l=l;
	tree[node].r=r;
	tree[node].lazy=0;
	if(l==r){
		tree[node].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,L_s);
	build(mid+1,r,R_s);
	pushup(node);
}
inline void maketag(int k,int node){
	tree[node].sum+=k*(tree[node].r-tree[node].l+1);
	tree[node].lazy+=k; 
}
inline void pushdown(int node){
	maketag(tree[node].lazy,L_s);
	maketag(tree[node].lazy,R_s);
	tree[node].lazy=0;
}
inline int query(int x,int node){
	if(tree[node].l==tree[node].r){
		return tree[node].sum;
	}
	if(tree[node].lazy!=0)pushdown(node);
	int m=(tree[node].l+tree[node].r)>>1;
	if(x<=m)query(L_s,x);
	else query(R_s,x);
}
inline void change(int node,int x,int k){
	if(tree[node].l==tree[node].r){
		tree[node].sum=k;
		return;
	}
	pushdown(node);
	int m=(tree[node].l+tree[node].r)>>2;
	if(x<=m)change(L_s,x,k);
	else change(R_s,x,k);
	tree[node].sum=tree[L_s].sum+tree[R_s].sum;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n,Q;
	cin>>n>>Q;
	for(int i=1;i<=n;i++)cin>>a[i];	
	build(1,n,1);
	while(Q--){
		int s;
		cin>>s;
		if(s==1){
			int x,v;
			cin>>x>>v;
			change(1,x,v);
		}
		else{
			int x;
			cin>>x;
			m d[8010];
			for(int i=1;i<=n;i++){
				d[i].sum=query(i,1);
				d[i].pl=i;
			}
			sort(d+1,d+n+1,cmp);
			cout<<query(d[x].pl,1)<<'\n';
		}
	}
} 
2024/6/9 06:53
加载中...