奇妙な。なぜ私は3ヶ月間アップしませんでした前に、この質問です。。。
セグメントツリーはチームメイトが終わったああ
https://blog.csdn.net/hzk_cpp/article/details/92797305
このの健康
まず、我々は[i]の並べ替えを持って、
実際に平準化期間の間隔に保たれ、
すべての数はIとI + 1は、同じ大きさのプロセスになる前に、それは、あります。
私たちは、簡単に数を求めるべきであるものに相当するブルドーザーかを判断することができます。
降圧レベルをプッシュしていませんでした後。
今、私たちは小さなセクションkを見つける必要があります。それは答えです。
もちろん、我々は半分の添字、その後、停止して、クエリのプレフィックスことができます。
単一のログ・セグメントツリーを持つこの事は良くキャスト。
その後、我々は同じ考えはフェンウィックツリーで倍増することができます。
ああではありませんか???なぜこの問題は、私はああ前に3ヶ月間見ていないのですか????この二分法は、数日前(週)CFはそれを持っていた吸盤ツリーラインではないでしょうか???
キンキー奇数学んだスキル
固有のパフォーマンス
#define 你老婆的名字 inline
次に、各関数の前にすべてのあなたの妻の名前を追加することができます。
嫌な死の家
#include <bits/stdc++.h>
#include <bits/extc++.h>
#define pii pair<ll,int>
#define sakuratxdy inline
using namespace std;
typedef long long ll;
const int N = 1e6+5;
ll bit[N];
int n,m,t;int a[N];
sakuratxdy int lowbit(int x){return x & -x;}
sakuratxdy void upd(int pos, int x){
while (pos<N)bit[pos]+=x,pos+=lowbit(pos);
}
sakuratxdy int que(int pos){
int res = 0;
for(int i=19;i>=0;i--){
if(res+(1<<i)<=m&&pos>bit[res+(1<<i)])
pos-=bit[res+(1<<i)],res+=1<<i;
}
return res+1;
}
struct Node{
ll val,id;
}node[N];
pii q[N];int ans[N];
bool cmp(Node a,Node b){
return a.val<b.val||(a.val==b.val&&a.id<b.id);
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m>>t;
for(int i=1;i<=n;i++)cin>>a[i],node[a[i]].val++;
for(int i=1;i<=m;i++)node[i].id=i;
sort(node+1,node+1+m,cmp);
for(int i=1;i<=t;i++){
cin>>q[i].first,q[i].second=i,q[i].first-=n;
}
sort(q+1,q+1+t);
ll now = 0;int j=1;
for(int i=1;i<m;i++){
upd(node[i].id,1);
while (j<=t&&q[j].first<=now+(node[i+1].val-node[i].val)*i){
int t=(q[j].first-now)%i;
ans[q[j++].second]=que(t==0?i:t);
}
now+=(node[i+1].val-node[i].val)*i;
}
upd(node[m].id,1);
while (j<=t){//
int t = (q[j].first-now)%m;
ans[q[j++].second]=que(t==0?m:t);
}
for(int i=1;i<=t;i++){
cout<<ans[i]<<'\n';
}
}