Cod sursa(job #1076041)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 9 ianuarie 2014 20:33:49
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <fstream>
#include <algorithm>
#include <iostream>

int n,aib[100001],pas=1<<16;

/*
#define f(a,b,c) for(int a = b; a <= c; a++);
*/

int query(int p){
    int s=0;
    while(p!=0){
        s+=aib[p];
        p-=p&(-p);
    }
    return s;
}

void update(int p,int val){

    while(p<=n){
        aib[p]+=val;
        p+=p&(-p);
        }
}

int cautbin(int x,int val){
    int pas = 1<<16;
    while(pas!=0){
        if(x+pas<=n&&aib[x+pas]<=val){
            val-= aib[x+pas];
            x+=pas;
        }
        pas/=2;
    }
    if(x==0){
        return -1;
    }
    if(val==0){
        return x;
    }
    return -1;
}


int main(){

    int tip,x,m,a,b;

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

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

    for(int i=1;i<=n;i++){

        scanf("%d",&x);
        update(i,x);

    }

    for(int i=1;i<=m;i++){

        scanf("%d",&tip);
        if(tip<=1){

            scanf("%d%d",&a,&b);

            if(tip==0)  update(a,b);

            else if(tip==1){

                printf("%d\n",query(b)-query(a-1));

            }

        }
        else{

            scanf("%d",&a);
            printf("%d\n",cautbin(0,a));
        }
    }
    return 0;
}