Cod sursa(job #2304253)

Utilizator Vlad3108Tir Vlad Ioan Vlad3108 Data 17 decembrie 2018 20:13:50
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
using namespace std;
int n,m;
int AIB[100005];
int lsb(int x){
    return x&(-x);
}
void Update(int poz,int val){
    for(int i=poz;i<=n;i+=lsb(i))
        AIB[i]+=val;
}
int Query(int poz){
    int ans=0;
    for(int i=poz;i>0;i-=lsb(i))
        ans+=AIB[i];
    return ans;
}
int Solve(int Sum){
    int st=1,dr=n;
    while(st<=dr){
        int mij=(st+dr)>>1;
        int S=Query(mij);
        if(S<Sum)
            st=mij+1;
        else if(S>Sum)
            dr=mij-1;
        else return mij;
    }
    return -1;
}
int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;++i){
        int x;
        scanf("%d",&x);
        Update(i,x);
    }
    for(int i=1;i<=m;++i){
        int t,a,b;
        scanf("%d",&t);
        if(t==0){
            scanf("%d %d",&a,&b);
            Update(a,b);
        }
        else if(t==1){
            scanf("%d %d",&a,&b);
            printf("%d\n",Query(b)-Query(a-1));
        }
        else{
            scanf("%d",&a);
            printf("%d\n",Solve(a));
        }
    }
	return 0;
}