Cod sursa(job #1972325)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 22 aprilie 2017 20:04:14
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
#define nr_zerouri(x) (x ^ (x - 1)) & x
using namespace std;
const int NMAX = 100005;
int v[NMAX];
void actualizare(int poz, int val, int n)
{
    while(poz <= n) {
        v[poz] += val;
        poz += nr_zerouri(poz);
    }
}
int suma(int i)
{
    int sol = 0;
    while(i > 0) {
        sol += v[i];
        i -= nr_zerouri(i);
    }
    return sol;
}
int caut_bin(int val, int n)
{
    int st, dr, mij, sum, last = -1;
    st = 1;
    dr = n;
    while(st <= dr) {
        mij = (st + dr) / 2;
        sum = suma(mij);
        if(sum < val) {
            st = mij + 1;
        }
        else {
            if(sum == val) {
                last = mij;
            }
            dr = mij - 1;
        }
    }
    return last;
}


int main()
{
    int n, m, i, a, b, tip, x;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d", &n, &m);
    for(i = 1;i <= n; ++i) {
        scanf("%d", &x);
        actualizare(i, x, n);
    }
    for(i = 1;i <= m; ++i) {
        scanf("%d%d", &tip, &a);
        if(tip == 0) {
            scanf("%d", &b);
            actualizare(a, b, n);
        }
        else if(tip == 1) {
            scanf("%d", &b);
            printf("%d\n", suma(b) - suma(a - 1));
        }
        else if(tip == 2) {
            printf("%d\n", caut_bin(a, n));
        }
    }
    return 0;
}