Cod sursa(job #717948)

Utilizator Sm3USmeu Rares Sm3U Data 20 martie 2012 12:39:06
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <stdio.h>
#define nMax 100010

using namespace std;

int n;
int a[nMax];

void adauga(int pozitie, int valoare)
{
    int k = 0;
    while (pozitie <= n){
        a[pozitie] += valoare;
        while ( (pozitie & (1 << k) ) == 0){
            k ++;
        }
        pozitie += 1 << k;
        k ++;
    }
}

int suma (int pozitie)
{
    int k = 0;
    int s = 0;
    while (pozitie > 0){
        s += a[pozitie];
        while (!(pozitie & (1 << k))){
            k ++;
        }
        pozitie -= 1 << k;
        k ++;
    }
    return s;
}

int interval (int x, int y)
{
    return suma(y) - suma(x - 1);
}

void caz2(int x)
{
    int st = 1;
    int dr = n + 1;
    int mij;
    while (st != dr){
        mij = (st + dr) >> 1;
        int s = suma (mij);
        if (s == x){
            break;
        }
        if (s < x){
            st = mij + 1;
        }else{
            dr = mij;
        }
    }
    if (suma (mij) != x){
        printf ("-1\n");
    }
    while (suma (mij - 1) == x){
        mij --;
    }
    printf ("%d\n", mij);
}

void citire()
{
    int operatii;
    scanf ("%d %d", &n, &operatii);
    for (int i = 1; i <= n; ++ i){
        int x;
        scanf ("%d", &x);
        adauga (i, x);
    }
    while (operatii --){
        int caz;
        int x;
        scanf ("%d", &caz);
        scanf ("%d", &x);
        if (caz == 2){
            caz2(x);
            continue;
        }
        int y;
        scanf ("%d", &y);
        if (caz == 0){
            adauga (x, y);
            continue;
        }
        printf ("%d\n", interval (x, y));

    }

}

int main()
{
    freopen ("aib.in", "r", stdin);
    freopen ("aib.out", "w", stdout);

    citire();

    return 0;
}