Cod sursa(job #1237509)

Utilizator UMihneaUngureanu Mihnea UMihnea Data 4 octombrie 2014 11:28:03
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
using namespace std;
int V[100010],n,m,x,i,a,b,suma(int),L,R,M;
void upd(int,int);
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",&x);
        upd(i,x);
    }
    for(;m;m--)
    {
        scanf("%d",&x);
        if(x==0)
        {
            scanf("%d%d",&a,&b);
            upd(a,b);
            continue;
        }
        if(x==1)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",suma(b)-suma(a-1));
            continue;
        }
        scanf("%d",&a);
        if(suma(n)<a)
        {
            printf("-1\n");
            continue;
        }
        for(L=0,R=n;R-L>1;)
        {
            M=(L+R)/2;
            if(suma(M)<a)L=M;
            else R=M;
        }
        if(suma(R)==a)printf("%d\n",R);
        else printf("-1\n");
    }
    return 0;
}
int suma(int poz)
{
    int ret = 0;
    for(;poz;poz-=poz&(-poz))
        ret+=V[poz];
    return ret;
}
void upd(int poz, int val)
{
    for(;poz<=n;poz+=poz&(-poz))
        V[poz]+=val;
}