Cod sursa(job #1324244)

Utilizator MoneaVladMonea Vlad MoneaVlad Data 21 ianuarie 2015 23:50:44
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream> //poz & (poz - 1) ^ poz = k ---> nr de zerouri in codul binar
#include <fstream>
#define Nmax 100001

using namespace std;

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

int n, m, v[Nmax];

void aduna(int poz, int val) {
    for(poz; poz <= n; poz += poz & (poz - 1) ^ poz) {
        v[poz] += val;
    }
}

int suma(int poz) {
    int i, s = 0;
    for(i = poz; i > 0; i -= i & (i - 1) ^ i)
        s += v[i];
    return s;
}

int cauta(int st, int dr, int val) {
    int mid, rez;
    while(st <= dr) {
        mid = st + (dr - st) / 2;
        rez = suma(mid);
        if(rez <= val) {
            st = mid + 1;
            if(rez == val)
                return mid;
        }
        else
            dr = mid - 1;
    }
    return -1;
}

int main()
{
    int a, b, i, t, x;
    in >> n >> m;
    for(i = 1; i <= n; i++) {
        in >> x;
        aduna(i, x);
    }
    for(i = 1; i <= m; i++) {
        in >> t;
        if(t == 2) {
            in >> a;
            out << cauta(1, n, a) << '\n';
            continue;
        }
        in >> a >> b;
        if(t == 1){
            out << suma(b) - suma(a - 1) << '\n';
        }
        else if(t == 0) {
            aduna(a, b);
        }
    }
    in.close();
    out.close();
    return 0;
}