Cod sursa(job #1761754)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 22 septembrie 2016 20:18:17
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define N 100100

using namespace std;

int v[N];
int n;



void update(int it,int val){

    while(it<=n){
        v[it]+=val;
        //it=it+(it^ (it& (it-1) ) );
        it=it+( (it& (-it) ) );
    }
}

int sum(int it){
    static int s;

    s=0;
    while(it>0){
        s+=v[it];
        it=it&(it-1);
    }
    return s;
}

int srch(int x){
    static int span,k;

    for(span=1;span<n; span<<=1);


    for(k=0 ; span ; span>>=1){
        if(k+span>n){
            continue;
        }
        if(x>=v[k+span]){
            k+=span;
            x-=v[k];
            if(!x){
                return k;
            }
        }
    }
    return -1;
}

int main(){
    int m,i,x,y;
    int t;

    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);

    scanf("%d%d",&n,&m);

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

    for(i=0;i<m;i++){
        scanf("%d",&t);
        if(t==0){
            scanf("%d%d",&x,&y);
            update(x,y);
        }else if(t==1){
            scanf("%d%d",&x,&y);
            printf("%d\n",sum(y)-sum(x-1) );
        }else{
            scanf("%d",&x);
            printf("%d\n",srch(x));
        }
    }

    return 0;
}