代码求调
查看原帖
代码求调
935908
zengziqvan楼主2024/7/30 02:23

样例没过。

#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
//#define int long long
//#define double long double
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define ROF(i,r,l) for(int i=r;i>=l;--i)
#define mkp make_pair
#define fr first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
using namespace std;
void IOS() {
	ios::sync_with_stdio(false);
	cin.tie(0);
}
void Document() {
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
}
inline int read(){
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}
	return s*w;
}
inline void write(int x){
	if(x<0){putchar('-');x=-x;}
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
void Tell() {
	//写数据结构注意初始化!
	//浮点数类题目过不了优先考虑精度!
	//vector动态开点注意内存重分配!
	//有本地写freopen!没本地别写!!!
	//最后几分钟给我老老实实坐那里,别手贱!!!
	//long long 级别的常数运算一定要用 xll!!!
	//一定要手玩几组极限数据,防止爆数。
	//大数据关同步流! 大数据关同步流! 大数据关同步流!
	//删调试!删调试!删调试!删调试!删调试!
}
const int N=1e5+10;
int n,m,q,a[N],b[N],tot,tmp[2][30],cnt[2],root[N];
struct Ask {
	char op;
	int x,y,k;
}ak[N];
struct Node {
	int ls,rs;
	int siz;
}rt;
vector<Node>t;
int Get(int x) {
	return lower_bound(b+1,b+m+1,x)-b;
}
int Build(int nod) {
	t.pb(rt);
	t[++tot]=t[nod];
	return tot;
}
int change(int p,int l,int r,int x,int v) {
	p=Build(p);t[p].siz+=v;
	if(l==r) return p;
	int mid=l+r>>1,z;
	if(x<=mid) z=change(t[p].ls,l,mid,x,v),t[p].ls=z;
	else z=change(t[p].rs,mid+1,r,x,v),t[p].rs=z;
	return p; 
}
int query(int l,int r,int k) {
	if(l==r) return l;
	int sum=0,mid=l+r>>1;
	FOR(i,1,cnt[1]) sum+=t[t[tmp[1][i]].ls].siz;
	FOR(i,1,cnt[0]) sum-=t[t[tmp[0][i]].ls].siz;
	if(k<=sum) {
		FOR(p,0,1) FOR(i,1,cnt[p]) tmp[p][i]=t[tmp[p][i]].ls;
		return query(l,mid,k);
	} else {
		FOR(p,0,1) FOR(i,1,cnt[p]) tmp[p][i]=t[tmp[p][i]].rs;
		return query(mid+1,r,k-sum);
	}
}
void add(int x,int v) {
	int id=Get(a[x]);
	for(int i=x;i<=n;i+=i&-i) root[i]=change(root[i],1,m,id,v);
}
int ask(int l,int r,int k) {
	memset(tmp,0,sizeof tmp);
	cnt[0]=cnt[1]=0;
	for(int x=r;x;x-=x&-x) tmp[1][++cnt[1]]=root[x];
	for(int x=l-1;x;x-=x&-x) tmp[0][++cnt[0]]=root[x];
	return query(1,m,k);
}
int zl=0;
main() {
	cin>>n>>q;t.pb(rt);
	FOR(i,1,n) a[i]=read(),b[++zl]=a[i];
	FOR(i,1,q) {
		cin>>ak[i].op;
		ak[i].x=read(),ak[i].y=read();
		if(ak[i].op=='Q') ak[i].k=read();
		else b[++zl]=ak[i].y;
	}
	sort(b+1,b+zl+1);
	m=unique(b+1,b+zl+1)-b-1;
	FOR(i,1,n) add(i,1);
	FOR(i,1,q) {
		if(ak[i].op=='Q') printf("%d\n",a[ask(ak[i].x,ak[i].y,ak[i].k)]);
		else {
			add(ak[i].x,-1);
			a[ak[i].x]=ak[i].y;
			add(ak[i].x,1);
		}
	}
	return 0;
}

马蜂奇特,玄学 vector。

2024/7/30 02:23
加载中...