Cod sursa(job #2841007)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 29 ianuarie 2022 10:24:22
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <vector>

using namespace std;
int n;
vector<int> v,aib,sp;

void update(int poz,int val)
{
    for(;poz<=n;poz+=poz&(-poz))
        aib[poz]+=val;
}
int query(int poz)
{
    int s=0;
    for(;poz>0;poz-=poz&(-poz))
        s+=aib[poz];
    return s;
}
int lookfor(int x)
{
    int st=1,dr=n,med,s;
    while(st<=dr)
    {
        med=(st+dr)/2;
        s=query(med);
        if(s==x)
            return med;
        else
            if(s>x)
                dr=med-1;
            else
                st=med+1;
    }
    return -1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int i,k,x,ant=0,p,a,b,val;
    scanf("%d%d", &n,&k);
    v.push_back(0);
    aib.push_back(0);
    sp.push_back(0);
    for(i=1;i<=n;i++)
    {
        scanf("%d", &x);
        v.push_back(x);
        sp.push_back(sp[i-1]+x);
        ant+=x;
    }
    aib.push_back(v[1]);
    for(i=2;i<=n;i++)
    {
        aib.push_back(sp[i]-sp[i&(i-1)]);
    }
    for(i=1;i<=k;i++)
    {
        scanf("%d", &p);
        if(p==0)
        {
            scanf("%d%d", &a,&b);
            update(a,b);
        }
        if(p==1)
        {
            scanf("%d%d", &a,&b);
            printf("%d\n",query(b)-query(a-1));
        }
        if(p==2)
        {
            scanf("%d", &a);
            printf("%d\n",lookfor(a));
        }
    }
    return 0;
}