Cod sursa(job #1603974)

Utilizator popescu.octavianPopescu Octavian popescu.octavian Data 17 februarie 2016 21:07:58
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#define NMax 100005
#define zerouri(x) ((x^(x-1))&x)
using namespace std;
int N, M, v[NMax], i, tip, a , b, x;
void Adauga(int x, int val)
{
    for(int i=x; i<=N; i+=zerouri(i))
        v[i]+=val;
}
int Interog (int x)
{
    int ans=0;
    for(int i=x; i>0; i-=zerouri(i))
        ans+=v[i];
    return ans;
}
int Cauta (int val)
{
    int st=1, dr=N, m=(st+dr)/2;
    int suma=Interog(m);
    while(suma!=val&&st<=dr)
    {
        if(suma>val)
            dr=m-1;
            else if (suma<val) st=m+1;
        m=(st+dr)/2;
        suma=Interog(m);
    }
    if(st>dr) return -1;
    return m;
}
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);
        Adauga(i,x);
    }
    for(i=1;i<=M;i++)
    {
        scanf("%d",&tip);
        if(tip<2)
        {
            scanf("%d %d",&a,&b);
            if(tip==0) Adauga(a,b);
                else printf("%d\n",Interog(b)-Interog(a-1));
        }
        else
        {
            scanf("%d",&a);
            printf("%d\n",Cauta(a));
        }
    }
    return 0;
}