Cod sursa(job #2171233)

Utilizator andreiutu111Noroc Andrei Mihail andreiutu111 Data 15 martie 2018 11:38:18
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<bits/stdc++.h>
#define lbs(x) (x^(x-1))&x
using namespace std;
int N,M,tip,a,b,v[100001],Aib[400001];
void Update(int x,int y){
    for(int i=x;i<=N;i+=lbs(i))
        Aib[i]+=y;
}
int sum(int poz){
    int S=0;
    for(int i=poz;i>0;i-=lbs(i))
        S+=Aib[i];
    return S;
}
int solve(int x){
    int st=1,dr=N,mij;
    while(st<=dr){
        mij=(st+dr)/2;
        int s=sum(mij);
        if(x==s)return mij;
        else if(x<s)dr=mij-1;
        else st=mij+1;
    }
    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){
        scanf("%d",&v[i]);
        Update(i,v[i]);
    }
    while(M--){
        scanf("%d",&tip);
        if(tip==0){
            scanf("%d%d",&a,&b);
            Update(a,b);
        }else if(tip==1){
            scanf("%d%d",&a,&b);
            printf("%d\n",sum(b)-sum(a-1));
        }else{
            scanf("%d",&a);
            printf("%d\n",solve(a));
        }
    }
    return 0;
}