Cod sursa(job #427614)

Utilizator hendrikHendrik Lai hendrik Data 28 martie 2010 05:54:49
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

void open(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
}

int n,m,a,type,b,tree[100010],ans;

void update(int a,int b){
    for (int i=a;i<=n;i+=(i & -i)){
        tree[i]+=b;
    }
}

int query(int a){
    int sum=0;
    for (int i=a;i>0;i-=(i & -i)){
        sum+=tree[i];
    }
    return sum;
}

int main(){
    open();
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++){
        scanf("%d",&b);
        update(i,b);
    }
    for (int i=0;i<m;i++){
        scanf("%d",&type);
        if (type==0){
            scanf("%d%d",&a,&b);
            update(a,b);
        }
        else if (type==1){
            scanf("%d%d",&a,&b);
            printf("%d\n",query(b)-query(a-1));
        }
        else {
            scanf("%d",&b);
            int lo=1,hi=n;
            ans=-1;
            while (1){
                int mid=(lo+hi)>>1;
                if (query(mid)<b){
                    lo=mid+1;
                }
                else {
                    ans=mid;
                    hi=mid-1;
                }
                if (lo>hi) break;
            }
            if (query(ans)!=b){
                ans=-1;
            }
            printf("%d\n",ans);
        }
    }
    //system("pause");
    return 0;
}