Advertisement
Guest User

Untitled

a guest
Jan 19th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.35 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const ll N = 100001;
  8.  
  9. ll a[N];
  10. ll t[4 * N];
  11.  
  12. void build(ll v, ll l, ll r) {
  13.     if (l == r) {
  14.         t[v] = !a[l];
  15.         return;
  16.     }
  17.     ll m = (r + l) / 2;
  18.     build(2 * v, l, m);
  19.     build(2 * v + 1, m + 1, r);
  20.     t[v] = t[2 * v] + t[2 * v + 1];
  21. }
  22.  
  23. void update(ll v, ll l, ll r, ll pos, ll x) {
  24.     if (l == r) {
  25.         t[v] = !x;
  26.         return;
  27.     }
  28.     ll m = (r + l) / 2;
  29.     if (pos <= m) {
  30.         update(2 * v, l, m, pos, x);
  31.     }
  32.     else {
  33.         update(2 * v + 1, m + 1, r, pos, x);
  34.     }
  35.     t[v] = t[2 * v] + t[2 * v + 1];
  36. }
  37.  
  38. ll get_kth(ll v, ll l, ll r, ll k) {
  39.     if (t[v] < k) {
  40.         return N + 1;
  41.     }
  42.     if (l == r) {
  43.         return l;
  44.     }
  45.     ll m = (r + l) / 2;
  46.     if (t[2 * v] >= k) {
  47.         return get_kth(2 * v, l, m, k);
  48.     }
  49.     else {
  50.         return get_kth(2 * v + 1, m + 1, r, k - t[2 * v]);
  51.     }
  52. }
  53.  
  54. ll get_sum(ll v, ll l, ll r, ll L, ll R) {
  55.     if (r < R || R < l) {
  56.         return 0;
  57.     }
  58.     if (L == l && r == R) {
  59.         return t[v];
  60.     }
  61.     ll m = (r + l) / 2;
  62.     return get_sum(2 * v, l, m, L, R) + get_sum(2 * v + 1, m + 1, r, L, R);
  63. }
  64.  
  65. int main() {
  66.     ll n;
  67.     cin >> n;
  68.     for (ll i = 1; i <= n; i++) {
  69.         cin >> a[i];
  70.     }
  71.     build(1, 1, n);
  72.     ll m;
  73.     cin >> m;
  74.     for (ll i = 0; i < m; i++) {
  75.         ll l, r, k;
  76.         cin >> l >> r >> k;
  77.         ll res = get_kth(1, 1, n, k + get_sum(1, 1, n, 1, l - 1));
  78.         cout << (res <= r ? res : -1) << ' ';
  79.     }
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement