Cod sursa(job #1575250)

Utilizator AndyCatrunaCatruna Andy AndyCatruna Data 21 ianuarie 2016 11:56:38
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <algorithm>
#define dim 100005
#define bit(x) (x&(-x))
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,i,v[dim],A[dim],x,m,a,b,c;
int query(int p){
    int sum=0;
    for(int i=p;i>=1;i-=bit(i)){
        sum+=A[i];
    }
    return sum;
}
void update(int p, int val){
    for(int i=p;i<=n;i+=bit(i)){
        A[i]+=val;
    }
}
int cautare(int val){
    int i=0,j=0,sum=0;
    for(j=1;j<n;j*=2);
    for(;j>0;j/=2){
        if(i+j<n){
            if(sum+A[i+j]<val){
                sum+=A[i+j];
                i=i+j;
            }
        }
    }
    if(query(i+1)==val){
        return i+1;
    }
    else{
        return -1;
    }

}
int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++){
        fin>>x;
        update(i,x);
    }
    for(i=1;i<=m;i++){
        fin>>a;
        if(a==0){
            fin>>b>>c;
            update(b,c);
        }
        else{
            if(a==1){
                fin>>b>>c;
                fout<<query(c)-query(b-1)<<"\n";
            }
            else{
                fin>>b;
                fout<<cautare(b)<<"\n";
            }
        }

    }


return 0;
}