fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. vector <long long > tree, a ;
  6. int merge(int a, int b) {
  7. return a, b;
  8. }
  9.  
  10. void build (int a[], int v, int l, int r){
  11. if(r==l+1){
  12. if(a[l]==0)
  13. tree[v]=1;
  14. else tree[v]=0;
  15. return;
  16. }
  17. int m=(l+r)/2;
  18. build (a,2*v+1, l , m);
  19. build (a,2*v+2, m , r);
  20. tree[v]=merge (tree[2*v+1],tree[2*v+2]);
  21. }
  22. int get(int v, int l, int r, int k){
  23. if(r-1==l){
  24. return l;
  25. }
  26. int m=(l+r)/2;
  27. if(tree[2*v+1]>=k){
  28. return get(2*v+1, l, m , k);
  29. } else {
  30. return get(2*v+2, m , r , k-tree[2*v+1]);
  31. }
  32. }
  33. int main() {
  34. int n;
  35. cin>>n;
  36. int a[n];
  37. for(int i=0; i<n; i++){
  38. cin>>a[i];
  39. }
  40. tree.resize(4*n);
  41. build(a,0,0,n);
  42. int k;
  43. cin>>k;
  44. for(int i=0; i<k; i++){
  45. int q;
  46. cin>>q;
  47. if(tree[0]<q) cout<<-1<<" ";
  48. else cout<<get(0,0,n,q)+1<<" ";
  49.  
  50. }
  51. }
Success #stdin #stdout 0.01s 5284KB
stdin
7
2 0 3 0 0 2 0
3
1
4
5
stdout
4 -1 -1