Cod sursa(job #1650747)

Utilizator RaTonAndrei Raton RaTon Data 11 martie 2016 20:16:46
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <stdio.h>
using namespace std;

int F[100001];
int n, m;
long long sum;

void update( int poz, int val ){
    while( poz <= n ){
        F[poz] += val;
        poz += (poz&(-poz));
    }
}

long long functie( int poz ){
    long long rez;
    rez = 0;
    while( poz >= 1 ){
        rez += F[poz];
        poz -= (poz&(-poz));
    }
    return rez;
}

int cauta( int st, int dr ){
    int m;
    m = (st + dr) / 2;
    if( functie(m) == sum && functie(m-1) < sum )
        return m;
    if( st <= dr ){
        if( functie(m) => sum )
            return cauta(st,m-1);
        else
            return cauta(m+1,dr);
    }
    else
        return -1;

}


/*int cauta( int st, int dr ){
    int m;

    while( st <= dr ){
        m = (st + dr) / 2;
        if( functie(m) == sum && functie(m-1) < sum )
            return m;
        else{
            if( functie(m) < sum )
                st = m + 1;
            else
                dr = m - 1;
        }
    }
    return -1;
}*/

int main()
{
    FILE *fi, *fo;
    int i, op, x, y, r;
    fi = fopen( "aib.in", "r" );
    fo = fopen( "aib.out", "w" );
    fscanf( fi, "%d%d", &n, &m );

    for( i = 1; i <= n; i++ ){
        fscanf(fi, "%d", &x );
        update(i,x);
    }

    for( i = 1; i <= m; i++ ){
        fscanf(fi,"%d", &op);
        if( op == 0 ){
            fscanf(fi,"%d%d",&x,&y );
            update(x,y);
        }
        else if( op == 1 ){
            fscanf(fi,"%d%d",&x,&y );
            fprintf(fo,"%lld\n",(functie(y) - functie(x-1)) );

        }
        else{
            fscanf(fi,"%lld", &sum);
            r = cauta(1,n);
            fprintf(fo,"%d\n", r );
        }
    }
    return 0;
}