Cod sursa(job #1217625)

Utilizator MaarcellKurt Godel Maarcell Data 7 august 2014 20:33:04
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#define MAX 200000
using namespace std;

int N,M,k, tree[MAX], pos,val,sum,ql,qr;

void inc(int nod, int l, int r){
    if (l==r){
        tree[nod]+=val;
        return;
    }

    int mid=(l+r)>>1;
    if (pos<=mid)
        inc(nod<<1,l,mid);
    else
        inc((nod<<1)+1,mid+1,r);

    tree[nod]=0;

    if (nod<<1<MAX)
        tree[nod]+=tree[nod<<1];
    if ((nod<<1)+1<MAX)
        tree[nod]+=tree[(nod<<1)+1];
}

void query(int nod, int l, int r){
    if (ql<=l && r<=qr){
        sum+=tree[nod];
        return;
    }

    int mid=(l+r)>>1;
    if (ql<=mid && nod<<1<MAX)
        query(nod<<1,l,mid);
    if (mid<qr && (nod<<1)+1<MAX)
        query((nod<<1)+1,mid+1,r);
}

void get_k(int suma){
    int l=1, r=N;
    ql=1;

    while (l<r){
        qr=(l+r)>>1;
        sum=0;
        query(1,1,N);
        if (sum>suma)
            r=qr-1;
        else if (sum<suma)
            l=qr+1;
        else {
            l=qr;
            break;
        }
    }
    k=l;
    qr=l; sum=0;
    query(1,1,N);
    if (sum!=suma)
        k=-1;
}
int main(){
    ifstream in("aib.in");
    ofstream out("aib.out");
    in >> N >> M;

    int i,op;
    for (i=1; i<=N; i++){
        in >> val;
        pos=i;
        inc(1,1,N);
    }

    for (i=1; i<=M; i++){
        in >> op;
        if (op==0){
            in >> pos >> val;
            inc(1,1,N);
        }
        else if (op==1){
            in >> ql >> qr;
            sum=0;
            query(1,1,N);
            out << sum << "\n";
        }
        else {
            in >> val;
            get_k(val);
            out << k << "\n";
        }
    }
    return 0;
}