Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int n,m;
- int values[100005];
- int roots[100005];
- map <int,int> coordcompress;
- int uncompress[100005];
- int curval = 0;
- vector <int> vals;
- int tree[5000005];
- int L[5000005];
- int R[5000005];
- int root[100005];
- int ir = 0;
- int nf = 1;
- #ifdef DEBUG
- #define D(x...)cout << x << '\n'
- #else
- #define D(x...)
- #endif // DEBUG
- void build(int id = ir, int l = 0, int r = n-1)
- {
- tree[id] = 0;
- if(l==r)return;
- int mid = (l+r)/2;
- L[id]=nf++;
- R[id]=nf++;
- build(L[id],l,mid);
- build(R[id],mid+1,r);
- tree[id]=tree[L[id]]+tree[R[id]];
- }
- int upd(int p, int id, int l=0, int r = n-1)
- {
- int ID = nf++;
- tree[ID]=tree[id];
- if(l==r){
- tree[ID]++;
- return ID;
- }
- else{
- int mid = (l+r)/2;
- L[ID]=L[id];
- R[ID]=R[id];
- if(p<=mid){
- L[ID]=upd(p,L[ID],l,mid);
- }
- else{
- R[ID]=upd(p,R[ID],mid+1,r);
- }
- tree[ID]=tree[L[ID]]+tree[R[ID]];
- return ID;
- }
- }
- int curi, curj;
- int a,b,k;
- int query(int k,int node1=root[curj], int node2=root[curi-1], int l=0, int r = n-1)
- {
- //cout << l << " " << r << endl;
- int v1 = L[node1];
- int v2 = L[node2];
- int mid = (l+r)/2;
- //cout << tree[v1] << " " << tree[v2] << endl;
- //cout << l << " " << r << " " << mid << endl;
- if(l==r){
- return l;
- }
- if(tree[v1]-tree[v2]>=k){
- //cout << "yay" << endl;
- return query(k,v1,v2,l,mid);
- }
- int v3 = R[node1];
- int v4 = R[node2];
- int p = tree[v1]-tree[v2];
- //cout << mid+1 << " " << r << endl;
- return query(k-p,v3,v4,mid+1,r);
- }
- int main()
- {
- #ifdef DEBUG
- freopen("input.txt","r",stdin);
- #endif // DEBUG
- cin.tie(0),cout.tie(0),ios_base::sync_with_stdio(false);
- cin >> n >> m;
- for(int i=1;i<=n;i++){
- cin >> values[i];
- vals.push_back(values[i]);
- }
- sort(vals.begin(),vals.end());
- for(int i=0;i<vals.size();i++){
- coordcompress[vals[i]]=i;
- //cout << vals[i] << " " << coordcompress[vals[i]] << '\n';
- uncompress[i]=vals[i];
- }
- build();
- root[0] = 0;
- for(int i=1;i<=n;i++){
- root[i]=upd(coordcompress[values[i]],root[i-1]);
- }
- for(int i=0;i<m;i++){
- cin >> a >> b >> k;
- curi = a, curj = b;
- //cout << query(k) << '\n';
- cout << uncompress[query(k)] << '\n';
- }
- //cout << tree[root[7]] << '\n';*/
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement