Cod sursa(job #2412401)

Utilizator Dragne.Andrei11Dragne Andrei Dragne.Andrei11 Data 22 aprilie 2019 11:10:34
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
#define zero(x) (x&(-x))

using namespace std;

const int nmax=100005;

int aib[nmax];

void update(int poz, int val, int n)
{
    for(poz; poz<=n; poz+=zero(poz))
    {
        int x=zero(poz);
            aib[poz]+=val;
    }
}

int suma(int poz)
{
    int sum=0;
    for(poz; poz>0; poz-=zero(poz))
        sum+=aib[poz];
    return sum;
}

int bin_search(int val, int n)
{
    int beg=1, fin=n, m, x;
    while(beg<=fin)
    {
        m=(beg+fin)/2;
        x=suma(m);
        if(x==val)
            return m;
        else if(x<val)
            beg=m+1;
        else
            fin=m-1;
    }
    return -1;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    int n, m, i, t, a, b;

    scanf("%d%d", &n, &m);
    for(i=1; i<=n; i++)
    {
        scanf("%d", &a);
        update(i, a, n);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d", &t, &a);
        switch(t)
        {
        case 0:
            scanf("%d", &b);
            update(a, b, n);
            break;
        case 1:
            scanf("%d", &b);
            printf( "%d\n", suma(b)-suma(a-1));
            break;
        case 2:
            printf("%d\n", bin_search(a, n));
            break;
        }
    }

    return 0;
}