线段树写的,大佬帮帮忙
#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';
}
}
}