Cod sursa(job #1460023)

Utilizator jul123Iulia Duta jul123 Data 11 iulie 2015 14:52:31
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<bits/stdc++.h>

using namespace std;

int aib[100005];
int n;

int zeros(int i) {
    return i & (-i);
}
void update(int x, int val) {
    for(int i = x; i <= n; i += zeros(i))
        aib[i] += val;
}

int query(int x) {
    int sol = 0;
    for(int i = x; i > 0; i -= zeros(i))
        sol += aib[i];
    return sol;
}

int find(int k) {
    int step;
    for ( step = 1; step < n; step <<= 1 );
    for(int i = 0; step; step >>= 1)
        if(i + step <= n && aib[i + step] <= k) {
            k -= aib[i + step];
            i += step;
            if(k == 0)
                return i;
        }
    return -1;
}

int main()
{
    FILE *fin = fopen("aib.in", "r");
    FILE *fout = fopen("aib.out", "w");

    int m;
    int type, a, b, x;

    fscanf(fin, "%d %d", &n, &m);

    for(int i = 1; i <= n; ++i) {
        fscanf(fin, "%d", &a);
        update(i, a);
    }

    for(int i = 0; i < m; ++i) {
        fscanf(fin, "%d", &type);
        if(type == 0) {
            fscanf(fin, "%d %d", &a, &b);
            update(a, b);
        }
        if(type == 1) {
            fscanf(fin, "%d %d", &a, &b);
            fprintf(fout, "%d\n", query(b) - query(a - 1));
        }
        if(type == 2) {
            fscanf(fin, "%d", &x);
            fprintf(fout, "%d\n", find(x));
        }
    }
}