Cod sursa(job #531435)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 9 februarie 2011 17:49:53
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <math.h>
#define N 100005
#define M 150005
int sir[N];
int n,m;
int val;
using namespace std;
void add(int poz, int val) {
    while (poz <= n) {
        sir[poz]+=val;
        poz += poz & -poz;
    }
    return;
}
int computeSum(int poz) {
    int sum = 0;
    while (poz > 0) {
        sum += sir[poz];
        poz -= poz & -poz;
    }
    return sum;
}
int binSrch(int val) {
    int st = 1;
    int dr = n;
    while (st <= dr) {
        int mij = (st + dr) / 2;
        int s = computeSum(mij);
        if (s < val) st = mij + 1;
         else
        if (s > val) dr = mij - 1;
         else
          return mij;
    }
    return -1;
}
int main() {
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i = 1; i <= n; i++) {
        scanf("%d",&val);
        add(i,val);
    }
    for(int i = 1; i <= m; i++) {
        int cod;
        scanf("%d",&cod);
        if (cod == 0) {
            int a,b;
            scanf("%d %d",&a,&b);
            add(a,b);
        }
         else
        if (cod == 1) {
            int a,b;
            scanf("%d %d",&a,&b);
            printf("%d\n",computeSum(b) - computeSum(a-1));
        }
         else
        if (cod == 2) {
            scanf("%d",&val);
            printf("%d\n",binSrch(val));
        }
    }




    return 0;
}