Cod sursa(job #1199846)

Utilizator livliviLivia Magureanu livlivi Data 20 iunie 2014 21:14:19
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<cstdio>
#define ub(x) x&(-x)
using namespace std;

int v[100001];
int n;

void add(int a,int b){
    int i;
    for(i=a;i<=n;i+=ub(i))
        v[i]+=b;
}

int sum(int x){
    int i;
    int s;
    s=0;
    for(i=x;i>0;i-=ub(i))
        s+=v[i];
    return s;
}

int cb(int x){
    int st,dr,m,val;
    st=1;
    dr=n;
    while(st<dr){
        m=(st+dr)/2;
        val=sum(m);
        if (val==x) return m;
        if (val<x) st=m+1;
        else dr=m;
    }
    if (sum(st)!=x) return -1;
    return st;
}

int main(){
    freopen ("aib.in","r",stdin);
    freopen ("aib.out","w",stdout);
    int m,i,a,b,p;
    scanf ("%d%d",&n,&m);

    for(i=1;i<=n;i++){
        scanf ("%d",&a);
        add(i,a);
    }

    for(i=1;i<=m;i++){
        scanf ("%d",&p);
        if (p==0){
            scanf ("%d%d",&a,&b);
            add(a,b);
        }
        else
        if (p==1){
            scanf ("%d%d",&a,&b);
            printf ("%d\n",sum(b)-sum(a-1));
        }
        else {
            scanf ("%d",&a);
            printf ("%d\n",cb(a));
        }
    }
    return 0;
}