Cod sursa(job #652759)

Utilizator vendettaSalajan Razvan vendetta Data 26 decembrie 2011 11:05:12
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#define bit(x) (x & (-x))
const int nmax = 100005;

using namespace std;

int aib[nmax];
int n, m;

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

void udpate(int poz, int val);

void citeste(){

    f>>n>>m;
    for(int i=1; i<=n; ++i){
        int x;
        f>>x;
        udpate(i,x);
    }

}
void udpate(int poz, int val){

    for(; poz<=n; poz+=bit(poz))
        aib[poz]+=val;

}

int query(int poz){

    int s = 0;

    for(;poz>0; poz-=bit(poz)){
        s += aib[poz];
    }
    return s;
}

int bs(int a){

    int st = 1;
    int dr = n;
    int sol = 0;
    while(st <= dr){
        int mij = (st + dr) / 2;
        if (query(mij) >= a){
            sol = mij;
            dr = mij-1;
        }else st = mij + 1;
    }

    return sol;

}

void rezolva(){

    for(int i=1; i<=m; ++i){
        int tip;
        f>>tip;
        if (tip == 0){
            int x, y;
            f>>x>>y;
            udpate(x,y);
        }else if (tip == 1){
            int x,y;
            f>>x>>y;
            g<<query(y) - query(x-1)<<"\n";
        }else if (tip == 2){
            int a;
            f>>a;
            g<<bs(a)<<"\n";
        }
    }

}

int main(){

    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;

}