Cod sursa(job #1786852)

Utilizator martonsSoos Marton martons Data 23 octombrie 2016 19:25:42
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>

#define NMAX 100000
#define MAX (1<<31)-1

using namespace std;

int v[NMAX+1];
int n, m;

void update(int pos, int val){
    while(pos<=NMAX){
        v[pos] += val;
        pos += (pos&(-pos));
    }
}

int read(int pos){
    int res = 0;

    while(pos != 0){
        res += v[pos];
        pos -= (pos&(-pos));
    }

    return res;
}

int searchSum(int sum){
     int s, e, m;
     s = 1;
     e = n+1;

     while(1){
        m = (s+e)/2;
        int crt;
        crt = read(m);

        if(crt>sum){
            e = m;
        }

        else if(crt<sum){
            s = m;
        }

        else if(crt == sum)
            break;
     }

     //while(sum == read(m))m--;

     return m;
}

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

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

    for(int i=0;i<n;i++){
        int x;
        fscanf(f, "%d", &x);

        update(i+1, x);
    }

    for(int i=0;i<m;i++){
        int a, b, x;
        fscanf(f, "%d", &x);

        if(x == 0){
            fscanf(f, "%d %d", &a, &b);
            update(a, b);
        }
        else if(x == 1){
            fscanf(f, "%d %d", &a, &b);
            int res = read(b) - read(a-1);
            fprintf(f1, "%d\n", res);
        }
        else if(x == 2){
            fscanf(f, "%d", &a);
            int res = searchSum(a);
            fprintf(f1, "%d\n", res);
        }
    }
    return 0;
}