求助学校oj上的题
  • 板块题目总版
  • 楼主sjwhsss
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/8/15 14:47
  • 上次更新2024/8/15 16:51:21
查看原帖
求助学校oj上的题
982518
sjwhsss楼主2024/8/15 14:47

最后一个测试点中间输出了0,其他都是对的

#include <cstdio>
#include <algorithm>
#include <ctype.h>
#define ll long long
using namespace std;
const int maxn = 1e7+5;
int n , m , cnt , rt , ls[maxn<<1] , rs[maxn<<1] , tot , num , no;
ll sum[maxn<<1] , a[maxn] , c[maxn] , q[maxn] , d[maxn] , op[maxn] , b[maxn];
inline ll input()
{
	char ch=getchar();int x=0,f=1;
	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
	while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x*f;
}
inline void print(ll x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)print(x/10);
	putchar(x%10+48);
}
inline void PushUp(int p){sum[p]=sum[ls[p]]+sum[rs[p]];}
void Insert(int &p , int l , int r , int val)
{
	if (!p) p=++cnt;
	if (l == r){sum[p]++;return;}
	int mid = l + r >> 1;
	if (val <= mid) Insert(ls[p] , l , mid , val);
	else Insert(rs[p] , mid + 1 , r , val);
	PushUp(p);
	return;
}
ll Query(int &p , int l , int r , int k)
{
	if (!p)return 0;
	if (l == r)return l;
	int mid = l + r >> 1;
	if (k <= sum[rs[p]])return Query(rs[p] , mid + 1 , r , k);
	else return Query(ls[p] , l , mid , k - sum[rs[p]]);
}
int main ()
{
	//freopen("in.txt" , "r" , stdin);
	n=input() , m=input();
	for (int i = 1; i <= n; ++i){int x=input();a[++tot]=d[i]=x;}
	for (int i = 1; i <= m; ++i)
	{
		op[i]=input() , c[i]=input();
		if (op[i] == 1) a[++tot]=c[i];
	}
	sort(a + 1 , a + tot + 1);
	a[0]=-2147483647;
	for (int i = 1; i <= tot; i++)if(a[i] != a[i - 1])b[++num]=a[i];
	for (int i = 1; i <= n; ++i)Insert(rt , 1 , maxn , lower_bound(b + 1 , b + num + 1 , d[i])-b);
	for (int i = 1; i <= m; ++i)
	{
		if (op[i] == 1)Insert(rt , 1 , maxn , lower_bound(b + 1 , b + num + 1 , c[i])-b);
		else print(b[Query(rt , 1 , maxn , c[i])]),putchar('\n');
	}
	return 0;
}
2024/8/15 14:47
加载中...