Cod sursa(job #1355517)

Utilizator delia_99Delia Draghici delia_99 Data 22 februarie 2015 19:44:57
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#define ub(x) (x&(-x))
using namespace std;
int n,m,i,AIB[100010],op,x,a,b,pos,sol;

void add(int a,int b)
{
    int i;
    for(i=a; i<=n; i+=ub(i))
        AIB[i]+=b;
    return;
}

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

int binary_search(int x)
{
    int st=1,dr=n,Min=100001,m,s;
    while(st<=dr)
    {
        m=st+(dr-st)/2;
        s=sum(m);
        if(s==x && Min>m)
            Min=m;
        else
        {
            if(s>=x)
                dr=m-1;
            else st=m+1;
        }
    }
    if(Min==100001)
        return -1;
    else return Min;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d\n",&n,&m);
    for(i=1; i<=n; ++i)
    {
        scanf("%d ",&x);
        add(i,x);
    }
    scanf("\n");
    for(i=1; i<=m; ++i)
    {
        scanf("%d ",&op);
        if(op==0)
        {
            scanf("%d %d\n",&a,&b);
            add(a,b);
        }
        if(op==1)
        {
            scanf("%d %d\n",&a,&b);
            sol=sum(b)-sum(a-1);
            printf("%d\n",sol);
        }
        if(op==2)
        {
            scanf("%d\n",&x);
            pos=binary_search(x);
            printf("%d\n",pos);
        }


    }
    return 0;
}