Cod sursa(job #2005393)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 26 iulie 2017 22:45:53
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
using namespace std;

const int DIM = 1 << 17;

int bit[DIM];

inline void update(int p, int x)
{
    for (int i = p; i < DIM; i += (i & (-i)))
        bit[i] += x;
    return;
}

inline int query1(int p, int x = 0)
{
    for (int i = p; i > 0; i -= (i & (-i)))
        x += bit[i];
    return x;
}

inline int query2(int x, int s = 0, int p = 0)
{
    for (int i = (DIM >> 1); i; i >>= 1)
        if (s + bit[p + i] <= x)
            s += bit[p + i], p += i;
    return (s == x) ? (p == 0 ? -1 : p) : -1;
}

int main(void)
{
    freopen("aib.in" , "r", stdin );
    freopen("aib.out", "w", stdout);
    
    int n, q;
    scanf("%d %d", &n, &q);
    
    for (int i = 1; i <= n; ++i) {
        int x;
        scanf("%d", &x);
        
        update(i, x);
    }
    
    while (q--) {
        int t, p, x, y;
        scanf("%d", &t);
        
        switch(t) {
            case 0:
                scanf("%d %d", &p, &x);
                update(p, x);
                
                break;
            case 1:
                scanf("%d %d", &x, &y);
                printf("%d\n", query1(y) - query1(x - 1));
                
                break;
            case 2:
                scanf("%d", &x);
                printf("%d\n", min(n, query2(x)));
                
                break;
        }
    }
    
    return 0;
}