Cod sursa(job #1827715)

Utilizator anamaria41Raicu Ana anamaria41 Data 12 decembrie 2016 10:48:11
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>

using namespace std;

#define ub(x)(x&(-x))

int n,m,s,a,b,aib[100500],op,z;

int sum(int x)
{
    int i,suma=0;
    for( i=x ; i>0 ; i-=ub(i) )
        suma+=aib[i];
    return suma;
}

void add( int x,int y)
{
    int i;
    for(i=x; i<=n; i+=ub(i))
        aib[i]+=y;

}

int bsearch(int val,int st,int dr )
{
    int mid,t;

    while (st<=dr)
    {
        mid=(st+dr)/2;
        t=sum(mid);
        if (t < val)
                st = mid + 1;
        else if(t > val)
                  dr = mid - 1;
        else if (t == val)
                  return mid;
    }
    return -1;

}

int main()
{
    int i;

    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);

    scanf("%d%d", &n,&m);

    for(i=1; i<=n; i++)
    {
        scanf("%d",&a);
        add(i,a);
    }

    for(i=1; i<=m; i++)
    {
        scanf ("%d",&op);

        if(op==0)
        {
            scanf ("%d%d",&a,&b);
            add(a,b);
        }

        if(op==1)
        {
            s=0;
            scanf ("%d%d",&a,&b);
            s=sum(b)-sum(a-1);
            printf("%d\n",s);
        }

        if(op==2)
        {
            scanf("%d",&a);
            z=bsearch(a,1,n);

            printf("%d\n",z);
        }
    }
    return 0;
}