Cod sursa(job #607719)

Utilizator stefanrStefan Ruseti stefanr Data 13 august 2011 12:34:01
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>

#define NMAX 100001
#define nz(x) (x & -x)

int v[NMAX], n, m;

void create()
{
    for (int i = 1; i <= n; i++)
        if (i + nz(i) <= n) 
            v[i + nz(i)] += v[i];
}

void update(int a, int b)
{
    while (a <= n)
    {
        v[a] += b;
        a += nz(a);
    }
}

int suma(int x)
{
    int s = 0;
    while (x > 0)
    {
        s += v[x];
        x -= nz(x);
    }
    return s;
}

int query(int a, int b)
{
    return suma(b) - suma(a-1);
}

int pos(int s)
{
    int k = 0, i;
    while (s > 0)
    {
        i = 1;
        while (k + i <= n && v[k + i] <= s) i <<= 1;
        if (i == 1) return -1;
        i >>= 1;
        k += i;
        s -= v[k];
    }
    return k;
    
}


int main()
{
    int i, a, b, x;
    FILE *fin, *fout;
    fin = fopen("aib.in", "rt");
    fout = fopen("aib.out", "wt");
    fscanf(fin, "%d %d", &n, &m);
    for (i = 1; i <= n; i++)
        fscanf(fin, "%d", v+i);
    create();
    for (i = 1; i <= m; i++)
    {
        fscanf(fin, "%d", &x);
        switch (x)
        {
            case 0:
                fscanf(fin, "%d %d", &a, &b);
                update(a, b);
                break;
            case 1:
                fscanf(fin, "%d %d", &a, &b);
                fprintf(fout, "%d\n", query(a, b));
                break;
            case 2:
                fscanf(fin, "%d", &a);
                fprintf(fout, "%d\n", pos(a));
                break;
        }
    }
    fclose(fin);
    fclose(fout);
}