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