Cod sursa(job #2199912)

Utilizator ContDeRacistAliniateEBlat ContDeRacist Data 29 aprilie 2018 15:51:06
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>

using namespace std;

#define lsb(a) a&(-a)

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

long long x, p, n, v[100000];

void adg() {
    while (p <= n) {
        v[p] += x;
        p += lsb(p);
    }
}

long long sum(long long pz) {
    long long ans(0);
    while (pz > 0) {
        ans += v[pz];
        pz -= lsb(pz);
    }
    return ans;
}

long long cb(long long val) {
    long long pas = 1<<16, r = 0;
    while (pas > 0) {
        if (r + pas <= n && sum(r + pas) <= val) {
            r += pas;
        }
        pas >>= 1;///     0 dak !E solutieh
    }///                         \/
    return (((r + 1) * (int)(sum(r) == val)) - 1);
}

int main()
{
    long long m, a, b, s, c;
    cin >> n >> m;
    for (long long i = 1; i <= n; ++i) {
        cin >> x;
        p = i;
        adg();
    }
    for (long long i = 0; i < m; ++i) {
        cin >> c;
        if (c == 0) {
            cin >> p >> x;
            adg();
        }
        if (c == 1) {
            cin >> a >> b;
            cout << sum(b) - sum(a - 1) << "\n";
        }
        if (c == 2) {
            cin >> s;
            cout << cb(s) << "\n";
        }
    }
    return 0;
}