Dynamic Rankings


实际上就是将单个询问的二分修改为同时处理多个询问
考虑二分答案
对于每一个mid,考虑询问是归为[l,mid]或[mid+1,r]
统计修改的贡献,同样将修改归为[l,mid]或[mid+1,r]

#include 
#define INF 1e9
using namespace std;
const int MAXN=3e5+5;
int n,m;
int x;
int a[MAXN];
int ans[MAXN];
struct Query{
	int op;
	int l,r,key;
	int pos,val;
}query[MAXN],lq[MAXN],rq[MAXN];
int Bit[MAXN];
int lowbit(int x)
{
	return x&(-x);
}
void update(int x,int k)
{
	for(int i=x;i<=n;i+=lowbit(i))
	{
		Bit[i]+=k;
	 } 
	 return;
}
int Sum(int k)
{
	int res=0;
	for(int i=k;i>=1;i-=lowbit(i))
	{
		res+=Bit[i];
	}
	return res;
}
char s[105];
int l,r,k;
void solve(int lv,int rv,int st,int ed)//递归处理[l,r]可能的答案对[st,ed]的答案 
{
	if(st>ed)
	{
		return;
	}
	//printf("%d %dfuck\n",st,ed);
	if(lv==rv)
	{
		
		for(int i=st;i<=ed;i++)
		{
			if(query[i].op>=1)
			{
				ans[query[i].op]=lv;
			}
		}//边界 
		return;
	}
	int mid=(lv+rv)>>1;
	int lt=0;
	int rt=0;
	for(int i=st;i<=ed;i++)
	{
		if(query[i].op<=0)
		{
			if(query[i].val<=mid)
			{
				int xfg=query[i].op;
				if(!xfg)
				{
					xfg++;
				}
				update(query[i].pos,xfg);
				lq[++lt]=query[i];
				//考虑小于mid的对询问的贡献	
			}
			else
			{
				rq[++rt]=query[i];
			}
		}
		else
		{
			int cg=(Sum(query[i].r)-Sum(query[i].l-1));
			int rest=query[i].key-cg;
			//如果rest>0,那么说明

相关