#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-x))
//#define int long long
using u64 = unsigned long long;
using namespace std;
std::mt19937_64 rng;
const int N=3e5+10;
typedef pair<int,int>PII;
vector<int > vs;
int m,n,k;
struct pp
{
int l,r,ma,k;
} tr[N*4];
void push_up(int node)
{
tr[node].ma =max(tr[node*2].ma ,tr[node*2+1].ma);
}
void build(int node,int l,int r)
{
tr[node]= {l,r};
if(l==r)
{
tr[node]= {l,r,m,k};
return ;
}
int mid=(l+r) /2;
build(node*2,l,mid);
build(node*2+1,mid+1,r);
push_up(node);
}
int update(int node,int val)
{
if(tr[node].ma < val) return -1;
if(tr[node].l==tr[node].r)
{
tr[node].ma -=val;
tr[node].k--;
if(tr[node].k==0) tr[node].ma =0;
return tr[node].l;
}
int ans;
if(tr[node*2].ma >= val) ans= update(node*2,val);
else ans= update(node*2+1,val);
push_up(node);
return ans;
}
signed main()
{
int i,j,w,a1;
scanf("%d",&w) ;
while(w--)
{
scanf("%d%d%d",&n,&m,&k);
build(1,1,n);
for(i=1; i<=n; i++)
{
scanf("%d",&a1);
printf("%d\n",update(1,a1));
}
}
return 0;
}
仓鼠的鸡蛋(线段树+二分)
最新推荐文章于 2025-04-29 16:31:41 发布