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