Cod sursa(job #1139543)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 11 martie 2014 11:37:30
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<cstdio>
#define zero(x) ((x^(x-1))&x)
using namespace std;
int i, aib[100005], n, s, op, x, y, k, st, dr, mij, nr;
bool ok;
void add(int poz){
    int i;
    for (i=poz;i<=n;i+=zero(i))
        aib[i]+=x;
}
int suma(int x){
    int i, s= 0;
    for (i=x;i>0;i-=zero(i))
        s+=aib[i];
    return s;
}
int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d", &n, &k);
    for (i=1;i<=n;i++) {
        scanf("%d", &x); add(i);
    }
    for (i=1;i<=k;i++) {
        scanf("%d", &op);
        if (op==0) {scanf("%d%d", &y, &x); add(y); continue;}
        if (op==1) {scanf("%d%d", &x, &y); s=suma(y)-suma(x-1); printf("%d\n", s); continue;}
        if (op==2) {
            st=1; dr=n; scanf("%d", &nr); ok=false;
            for (mij=(st+dr)/2;st<dr;mij=(st+dr)/2) {
                s=suma(mij); if (s==nr) {printf("%d\n", mij); ok=true; break;}
                if (s<nr) st=mij+1; else dr=mij-1;
                 }
            if (ok==false) {
                if (suma(st)==nr) printf("%d\n", st);
                else printf("-1\n");
            }
        }
    }
    return 0;
}