Cod sursa(job #1762551)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 23 septembrie 2016 18:53:29
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <cstdio>
#define NMAX 100005
#define MMAX 150005
using namespace std;

int N,M;
int a[NMAX];
int aib[NMAX];

void inserare(int i, int x)
{
    while(i<=N)
    {
        aib[i] += x;
        int p = (i^(i-1))&i;
        i += p;
    }
}

int suma(int i)
{
    int s = 0;
    while(i)
    {
        s+=aib[i];
        int p = (i^(i-1))&i;
        i = i - p;
    }
    return s;
}

int cauta(int x)
{
        int st=1,dr=N;
        while(st<dr)
        {
            int mij = (st+dr)/2;
            int val_mij = suma(mij);
            if(val_mij == x)
            {
                return mij;
            }
            if(val_mij < x)
            {
                st = mij+1;
            }
            if(val_mij > x)
            {
                dr = mij;
            }
        }

}

void citire()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;i++)
    {
        int x;
        scanf("%d",&x);
        inserare(i,x);
    }

    for(int i=1;i<=M;i++)
    {
        int tip;
        int a,b;
        scanf("%d",&tip);
        if(tip==0)
        {
            scanf("%d%d",&a,&b);
            inserare(a,b);
        }
        else if(tip==1)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",suma(b) - suma(a-1));
        }
        else
        {
            scanf("%d",&a);
            printf("%d\n",cauta(a));
        }

    }
}


int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    citire();

    return 0;
}