Cod sursa(job #1808620)

Utilizator LaurIleIle Laurentiu Daniel LaurIle Data 17 noiembrie 2016 21:46:16
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int aib[100005],N,M;
void adauga(int val,int x)
{
    do
    {   int a=x&(-x);
        aib[x]+=val;
        x+=x&(-x);
    }
    while(x<=N);
}
int suma(int x)
{
    int s=0;
    while(x!=0)
    {
        s+=aib[x];
       x-=x&(-x);
    }
    return s;
}

int cauta(int val)
{
    int i, step;

    for ( step = 1; step < N; step <<= 1 );

    for( i = 0; step; step >>= 1 )
    {

         if( i + step <= N)
         {
            if( val >= aib[i+step] )
            {
                i += step, val -= aib[i];
                if ( !val ) return i;
            }
         }
    }
    return -1;
}
int main()
{
    int val,k,x,y;
    f>>N>>M;
    for(int i=1;i<=N;i++)
    {
        f>>val;
        adauga(val,i);
    }

    for(int i=1;i<=M;i++)
    {
        f>>k;
        if(k==0)
        {
            f>>x>>y;
            adauga(y,x);
        }
        if(k==1)
        {
            f>>x>>y;
            g<<suma(y)-suma(x-1)<<"\n";
        }
        if(k==2)
        {
            f>>x;
            g<<cauta(x)<<"\n";
        }
    }
    return 0;
}