Cod sursa(job #1138576)

Utilizator victor_crivatCrivat Victor victor_crivat Data 10 martie 2014 11:46:11
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#define soto(x) (x&(-x))
using namespace std;
int aib[100001],i,j,m,n,a,b,x,y;
ifstream f("aib.in");
ofstream g("aib.out");
void update(int i,int val)
{
    int j;
    for ( j = i ; j <= n ; j += soto(j) )
        aib[j] += val;

}
int query ( int i )
{
    int sol = 0 , j ;
    for ( j = i ; j > 0 ; j -=soto(j) )
        sol += aib[j];
    return sol;
}
int inapoi(int val)
{
    int left = 1 , right = n, middle;
    for ( ; left <= right ; )
    {
        middle = ( left + right ) >> 1;
        int a = query ( middle );
        if ( a > val ) right = middle -1 ;
        else if ( a < val ) left = middle + 1 ;
        else if ( a == val ) return middle;
    }
    return -1;
}

int main()
{
    f>>n>>m;
    for (i=1; i<=n; i++)
    {
        f>>x;
        update (i,x);
    }
    for (i=1; i<=m; i++)
    {
        f>>y;
        if (y==2)
        {
            f>>a;
            g<<inapoi(a)<<'\n';
        }
        else
        {
            f>>a>>b;
            if ( y == 1 )  g<< query(b)  - query(a-1) << "\n";
            else update ( a  , b ) ;
        }
    }
    f.close();
    g.close();
    return 0;

}