Cod sursa(job #3309565)

Utilizator razviii237Uzum Razvan razviii237 Data 6 septembrie 2025 14:41:29
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
//#include <iostream>
#include <fstream>

using namespace std;
const int maxn = 1e5+5;

ifstream cin("aib.in");
ofstream cout("aib.out");

int n, m, x, tip, a, b;
int aib[100005];

// S[3, 5] = S[1, 5] - S[1, 2]
// S[a, b] = S[1, b] - S[1, a-1]

int suma(int a, int b) {
    if(a != 1)
        return suma(1, b) - suma(1, a-1);
    int p = 1 << 20, sumaTotala = 0, st = 0;
    while(p > 0) {
        if(st + p <= n && st + p <= b) {
            sumaTotala += aib[st + p];
            st += p;
        }
        p /= 2;
    }
    return sumaTotala;
}

int query(int a, int b) {
    if(a != 1)
        return suma(1, b) - suma(1, a-1);
    int sumaTotala = 0;
    while(b > 0) {
        sumaTotala += aib[b];
//        b = b & (b - 1);
        b -= (b & (-b));
    }
    return sumaTotala;
}

void update(int pos, int val) {
    while(pos <= n) {
        aib[pos] += val;
//        pos = 2 * pos - (pos & (pos - 1));
        pos += (pos & (-pos));
    }

    //      5         -5
    //00000101  11111011

    // 00000101 &
    // 11111011
    // 00000001

    //      4            -4
    // 00000100    11111100
    //
    // 00000100 &
    // 11111100
    // 00000100
}

int query2(int a) {
    int p = 1 << 20, r = 0, suma = 0, k = -1;
    while(p > 0) {
        if(r + p <= n && suma + aib[r + p] == a) {
            k = r + p;
        }
        if(r + p <= n && suma + aib[r + p] < a) {
            suma += aib[r + p];
            r += p;
        }
        p /= 2;
    }
    // suma = cea mai mare suma < a
    //    r = pozitia
    return k;
}

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i ++) {
        cin >> x;
        update(i, x);
    }
//    for(int i = 1; i <= n; i ++) {
//        cout << aib[i] << ' ';
//    }
    for(int i = 1; i <= m; i ++) {
        cin >> tip;
        if(tip == 0) {
            cin >> a >> b;
            update(a, b);
        } else if(tip == 1) {
            cin >> a >> b;
            cout << query(a, b) << '\n';
        } else if(tip == 2) {
            cin >> a;
            cout << query2(a) << '\n';
        }
    }

    return 0;
}