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,那么说明