Cod sursa(job #1950353)

Utilizator Train1Train1 Train1 Data 2 aprilie 2017 22:05:05
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#define maxN 100001
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, sumCautata;
int v[maxN];
int mark[maxN];
int getParent(int k) {
    return (k&(k-1));
}
int nextNode(int k) {
    return k + (k & -k);
}
void update(int pos, int val) {
    while(pos <= n) {
        v[pos] += val;
        pos = nextNode(pos);
    }
}
int sum(int poz) {
    int s = 0;
    /*
    while(k) {
        s+= v[k];
        k=getParent(k);
    }
    */
     for (;poz>=1;poz-=(poz&(-poz)))
          s+=v[poz];
    return s;
}
void binSearch(int st, int dr) {
    while(st <= dr) {
        int mij = (st + dr) / 2;
        int s = sum(mij);
        if(s == sumCautata) {
            fout<<mij<<'\n';
            break;
        } else if (s > sumCautata)
            dr = mij - 1;
        else st = mij + 1;
    }
    /*
    if(st > dr) return;
    int mij = st + (dr-st)/2;
    int s = sum(mij);
    if(s == sumCautata)
        fout<<mij<<'\n';
    else if(s > sumCautata) {
        binSearch(st, mij - 1);
    } else {
        binSearch(mij + 1, dr);
    }
    */
}
int main()
{
    fin>>n>>m;
    int x, y, op;
    for(int i = 1; i <= n; i++) {
        fin>>x;
        update(i, x);
    }
    for(int j = 1; j <= m; j++) {
        fin>>op;
        if(op == 0) {
            fin>>x>>y;
            update(x, y);
        } else if(op == 1) {
            fin>>x>>y;
            fout<<sum(y) - sum(x - 1)<<'\n';
        } else {
            fin>>sumCautata;
            binSearch(1, n);
        }
    }
    fin.close();
    fout.close();
    return 0;
}