Cod sursa(job #854209)

Utilizator enedumitruene dumitru enedumitru Data 12 ianuarie 2013 22:03:06
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#define slb(x) (x & -x)
using namespace std;
int N, M, A[100001];
void Update(int k,int x)
{   for(; k<=N; k+=slb(k)) A[k]+=x;}
int Query(int k)
{   int s=0;
    for(; k>0; k-=slb(k)) s+=A[k];
    return s;
}
int Search(int val)
{   int i, step;
    for (step=1; step<N; step<<=1);
    for(i=0; step; step>>=1)
         if(i+step<=N && val>=A[i+step])
            {   i+=step; val-=A[i];
                if(!val )return i;
            }
    return -1;
}
int main()
{   int K, X, Y;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1; i<=N; ++i)
        scanf("%d", &Y), Update(i,Y);
    while(M--)
    {   scanf("%d", &K);
        if(K<2)
        {    scanf("%d%d",&X,&Y);
             if(K)  printf("%d\n",Query(Y)-Query(X-1)); else  Update(X,Y);
        }
        else
        {   scanf("%d", &X); printf("%d\n", Search(X));}
    }
    return 0;
}