Cod sursa(job #989806)

Utilizator classiusCobuz Andrei classius Data 26 august 2013 15:30:45
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>

using namespace std;

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

int n;
int v[100001];

inline void update(int pz,int x){
    while(pz<=n){
        v[pz]+=x;
        pz+=pz&-pz;
    }

    return;
}

inline int query(int x,int y){
    int s1=0,s2=0;
    while(x>0){
        s1+=v[x];
        x-=x&-x;
    }
    while(y>0){
        s2+=v[y];
        y-=y&-y;
    }
    return s2-s1;
}

inline int search(int s){

    int c;
    for(c=1;c<n;c<<=1);

    for(int i=0;c;c>>=1){
        if(i+c<=n&&s>=v[i+c]){
            i+=c;
            s-=v[i];
            if(!s) return i;
        }
    }
    return -1;
}

int main()
{
    int m;

    f>>n>>m;

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

    for(int i=1;i<=m;i++){
        int cs,x,y;
        f>>cs;
        switch(cs){
            case 0: f>>x>>y; update(x,y); break;
            case 1: f>>x>>y; g<<query(x-1,y)<<'\n'; break;
            case 2: f>>x; g<<search(x)<<'\n'; break;
        }
    }


    return 0;
}