Cod sursa(job #2416406)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 27 aprilie 2019 15:18:39
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

int aib[100010],n,logn;

void update(int poz,int val)
{
    for(int i=poz;i<=n;i+=i&(-i)) aib[i]+=val;
}

int query(int poz)
{
    int s=0;
    for(int i=poz;i>0;i-=i&(-i)) s+=aib[i];
    return s;
}

int caut(int x)
{
    int poz=0;
    for(int i=logn;i>=0;i--)
        if(poz+(1<<i)<=n && x>aib[poz+(1<<i)])
        {
            poz+=(1<<i);
            x-=aib[poz];
        }
    return poz+1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,x,y,t;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(i,x);
    }
    while((1<<logn)<=n) logn++;
    logn--;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&t,&x);
        if(!t) {scanf("%d",&y);update(x,y);}
        else if(t==1)
        {
            scanf("%d",&y);
            printf("%d\n",query(y)-query(x-1));
        }
        else
        {
            int poz=caut(x);
            if(query(poz)==x) printf("%d\n",poz);
            else printf("-1\n");
        }
    }
    return 0;
}