Cod sursa(job #1183193)

Utilizator livliviLivia Magureanu livlivi Data 8 mai 2014 16:54:04
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<cstdio>
using namespace std;
int aib[100001];
int n;
int ub(int x){
    return (x&(-x));
}
void add(int x,int y){
    int i;
    for(i=x;i<=n;i+=ub(i))
        aib[i]+=y;
}
int sum(int x){
    int i,s=0;
    for(i=x;i>0;i-=ub(i))
        s+=aib[i];
    return s;
}
int cb(int x){
    int in=1,sf=n,m,k;
    while(in<sf){
        m=(in+sf)/2;
        k=sum(m);
        if (k==x) return m;
        else
        if (k<x) in=m+1;
        else sf=m;
    }
    if (sum(sf)==x) return sf;
    return -1;
}
int main(){
    freopen ("aib.in","r",stdin);
    freopen ("aib.out","w",stdout);
    int i,p,x,y,m;
    scanf ("%d%d",&n,&m);
    for(i=1;i<=n;i++){
        scanf ("%d",&x);
        add(i,x);
    }
    for(i=1;i<=m;i++){
        scanf ("%d",&p);
        if (p==0){
            scanf ("%d%d",&x,&y);
            add(x,y);
        }
        else
        if (p==1){
            scanf ("%d%d",&x,&y);
            printf ("%d\n",sum(y)-sum(x-1));
        }
        else {
            scanf ("%d",&x);
            printf ("%d\n",cb(x));
        }
    }
    return 0;
}