Cod sursa(job #2403406)

Utilizator RaduToporanRadu Toporan RaduToporan Data 11 aprilie 2019 15:28:26
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>

int n,m,numar,tip,i,j,s,x,y,a[100005];

void adauga(int k, int x)
{
    while (k<=n)
    {
        a[k]=a[k]+x;
        k=k+(k&(-k));
    }
}

int suma(int k)
{
    int s=0;
    while (k>=1)
    {
        s=s+a[k];
        k=k-(k&(-k));
    }
    return s;
}

int pmin(int S)
{
    int st=1, dr=n, mij, smij;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        smij=suma(mij);
        if (S>smij) st=mij+1;
            else dr=mij-1;
    }
    if (suma(st)==S) return st;
        else return -1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1; i<=n; i++)
    {
        scanf("%d",&numar);
        adauga(i,numar);
    }
    for (i=1; i<=m; i++)
    {
        scanf("%d",&tip);
        if (tip==2)
        {
            scanf("%d",&s);
            printf("%d\n",pmin(s));
        }
        else
        {
            scanf("%d%d",&x,&y);
            if (tip==0) adauga(x,y);
            if (tip==1) printf("%d\n",suma(y)-suma(x-1));
        }
    }
    return 0;
}