本地 AC,提交 RE!
查看原帖
本地 AC,提交 RE!
681036
OldDriverTree楼主2023/5/14 12:20

rt,全 RE 了,但是我自己下载了第一个测试点的数据,本地 AC 了呀

#include<bits/stdc++.h>
#define mid (l+r>>1)
using namespace std;
const int N=1e5+1;
int n,m,a[N],tot,root[N];
vector<int> Node[2],num;

struct Que {
	bool op; int x,y,z;
}Q[N];

struct node {
	int cnt,l,r;
}T[N*20];
	
void update(int &rt,int l,int r,int p,int v) {
	if (!rt) rt=(++tot); T[rt].cnt+=v; if (l==r) return;
	p<=mid?update(T[rt].l,l,mid,p,v):update(T[rt].r,mid+1,r,p,v);
}
int query(int l,int r,int k)
{
	if (l==r) return l; int sum=0;
	for (int o:Node[0]) sum+=T[T[o].l].cnt;
	for (int o:Node[1]) sum-=T[T[o].l].cnt;
	
	if (k<=sum)
	{
		for (int &o:Node[0]) o=T[o].l;
		for (int &o:Node[1]) o=T[o].l;
		return query(l,mid,k);
	}
	else
	{
		for (int &o:Node[0]) o=T[o].r;
		for (int &o:Node[1]) o=T[o].r;
		return query(mid+1,r,k-sum);
	}
}
int change(int pos,int val) {
	int p=lower_bound(num.begin(),num.end(),a[pos])-num.begin();
	for (int i=pos;i<=n;i+=i&-i) update(root[i],0,num.size()-1,p,val);
}
int Query(int l,int r,int k)
{
	Node[0].clear(),Node[1].clear();
	for (int i=r;i;i-=i&-i) Node[0].push_back(root[i]);
	for (int i=l-1;i;i-=i&-i) Node[1].push_back(root[i]);
	return query(0,num.size()-1,k);
}
int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]),num.push_back(a[i]);
	for (int i=0;i<m;i++) { char ch; cin>>ch; Q[i].op=(ch=='Q');
	if (ch=='Q') scanf("%d%d%d",&Q[i].x,&Q[i].y,&Q[i].z); else
	scanf("%d%d",&Q[i].x,&Q[i].y); num.push_back(Q[i].y); } sort(num.begin(),num.end() ); 
	num.erase(unique(num.begin(),num.end() ),num.end() ); for (int i=1;i<=n;i++) change(i,1);
	for (int i=0;i<m;i++) if (Q[i].op) printf("%d\n",num[Query(Q[i].x,Q[i].y,Q[i].z)]);
	else change(Q[i].x,-1),a[Q[i].x]=Q[i].y,change(Q[i].x,1); return 0;
}
2023/5/14 12:20
加载中...