Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- typedef long long ll;
- const ll N = 100001;
- ll a[N];
- ll t[4 * N];
- void build(ll v, ll l, ll r) {
- if (l == r) {
- t[v] = !a[l];
- return;
- }
- ll m = (r + l) / 2;
- build(2 * v, l, m);
- build(2 * v + 1, m + 1, r);
- t[v] = t[2 * v] + t[2 * v + 1];
- }
- void update(ll v, ll l, ll r, ll pos, ll x) {
- if (l == r) {
- t[v] = !x;
- return;
- }
- ll m = (r + l) / 2;
- if (pos <= m) {
- update(2 * v, l, m, pos, x);
- }
- else {
- update(2 * v + 1, m + 1, r, pos, x);
- }
- t[v] = t[2 * v] + t[2 * v + 1];
- }
- ll get_kth(ll v, ll l, ll r, ll k) {
- if (t[v] < k) {
- return N + 1;
- }
- if (l == r) {
- return l;
- }
- ll m = (r + l) / 2;
- if (t[2 * v] >= k) {
- return get_kth(2 * v, l, m, k);
- }
- else {
- return get_kth(2 * v + 1, m + 1, r, k - t[2 * v]);
- }
- }
- ll get_sum(ll v, ll l, ll r, ll L, ll R) {
- if (r < R || R < l) {
- return 0;
- }
- if (L == l && r == R) {
- return t[v];
- }
- ll m = (r + l) / 2;
- return get_sum(2 * v, l, m, L, R) + get_sum(2 * v + 1, m + 1, r, L, R);
- }
- int main() {
- ll n;
- cin >> n;
- for (ll i = 1; i <= n; i++) {
- cin >> a[i];
- }
- build(1, 1, n);
- ll m;
- cin >> m;
- for (ll i = 0; i < m; i++) {
- ll l, r, k;
- cin >> l >> r >> k;
- ll res = get_kth(1, 1, n, k + get_sum(1, 1, n, 1, l - 1));
- cout << (res <= r ? res : -1) << ' ';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement