Cod sursa(job #1225148)

Utilizator george_stelianChichirim George george_stelian Data 1 septembrie 2014 01:12:07
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
#define putere(x) x&(-x)

using namespace std;

int aib[100010],n,m,i,x,y,st,dr,mid;

void aib_update(int i,int s)
{
    for(;i<=n;i+=putere(i)) aib[i]+=s;
}

int aib_query(int i)
{
    int s=0;
    for(;i>0;i-=putere(i)) s+=aib[i];
    return s;
}

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);
        aib_update(i,x);
    }
    for(;m;m--)
    {
        scanf("%d",&x);
        if(x==0)
        {
            scanf("%d%d",&x,&y);
            aib_update(x,y);
        }
        else if(x==1)
        {
            scanf("%d%d",&x,&y);
            printf("%d\n",aib_query(y)-aib_query(x-1));
        }
        else
        {
            scanf("%d",&x);
            st=1;dr=n;
            while(st<=dr)
            {
                mid=(st+dr)/2;
                if(x<=aib_query(mid)) dr=mid-1;
                else st=mid+1;
            }
            if(x==aib_query(st)) printf("%d\n",st);
            else printf("-1\n");
        }
    }
    return 0;
}