Cod sursa(job #1508725)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 22 octombrie 2015 21:49:42
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

#define NMax 100001

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n, m, elem, aib[NMax], s;

int sum(int j)
{
    int sTmp = 0;
    
    while (j > 0) {
        sTmp += aib[j];
        j = j - (j & (-j));
    }
    
    return sTmp;
}

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

int binSrc(int val)
{
    int st = 1, dr = n, mid = 0, getSum = 0;
    
    while (st <= dr) {
        mid = (st+dr) / 2;
        getSum = sum(mid);
        
        if (getSum == val)
            return mid;
        else if (getSum < val)
            st = mid + 1;
        else
            dr = mid - 1;
    }
    
    return 1;
}

int main()
{
    f>>n>>m;
    
    for (int i=1; i<=n; i++) {
        f>>elem;
        update(i, elem);
    }
    
    int query = 0, val1 = 0, val2 = 0;
    for (int i=1; i<=m; i++) {
        f>>query;
        
        if (query == 0) {
            f>>val1>>val2;
            
            update(val1, val2);
        }
        else if (query == 1) {
            f>>val1>>val2;
            
            g<<sum(val2) - sum(val1-1)<<"\n";
        }
        else {
            f>>val1;
            
            g<<binSrc(val1)<<"\n";
        }
    }
    
    return 0;
}