题意:给一个长为n的数组,q次询问(n,q<=5e5),每次给一个k(k<=1e18),求第k次填数是填第几个数(每次填数选择最小的数进行+1操作,如果有多个优先加下标最小的那个)
题解:离线,又由于每次改变都是成块地改变,所以可以成块改变就成块改变,不能成块改变就直接求第k小,可以用权值线段树求第k小
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define debug(x) cout<<#x<<" is "<<x<<endl;
const int maxn=5e5+5;
const double eps=1e-3;
const ll inf=1e18;
struct pot{
int id;
ll cnt;
}p[maxn],que[maxn];
ll a[maxn],b[maxn];
int c[maxn],ans[maxn];
bool cmp1(struct pot aa,struct pot bb){
if(aa.cnt!=bb.cnt)return aa.cnt<bb.cnt;
return aa.id<bb.id;
}
bool cmp2(struct pot aa,struct pot bb){
if(aa.cnt!=bb.cnt)return aa.cnt<bb.cnt;
return aa.id<bb.id;
}
struct node{
int l;
int r;
int val;
}no[maxn