Cod sursa(job #975943)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 22 iulie 2013 06:30:14
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int n,aib[100001],m,x;

void update (int a, int b)
{
    int current=a;
    while (current<=n)
    {
        aib[current] += b;
        int lowest_bit = current&(-current);
        current += lowest_bit;
    }
}

int query (int a)
{
    int s=0;
    int current=a;
    while (current>0)
    {
        s+=aib[current];
        int lowest_bit = current&(-current);
        current -= lowest_bit;
    }
    return s;
}

int bynary_search (int a)
{
    int i=0,j;
    for (j=1; j<n; j<<=1);
    for (;j>=1;j>>=1)
    {
        if (aib[i+j]<a) i+=j;
    }
    if (a==aib[i+1]) return i+1;
    return -1;
}

int main()
{
    fin>>n>>m;
    for (int i=1; i<=n; i++)
    {
        fin>>x;
        update (i,x);
    }

    int op,a,b;

    for (int i=1; i<=m; i++)
    {
        fin>>op;
        if (op==0) {fin>>a>>b; update (a,b);}
        else if (op==1)
             {
                 fin>>a>>b;
                 x=query (b);
                 fout<<x-query(a-1)<<"\n";
             }
        else { fin>>a; fout<<bynary_search (a)<<"\n";}
    }
    return 0;
}