Cod sursa(job #1793291)

Utilizator MithrilBratu Andrei Mithril Data 30 octombrie 2016 21:24:47
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<bits/stdc++.h>
using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");
typedef unsigned int uint;
int n,m;
vector<int> arbore;

inline uint getParent(uint queriedNode){
    unsigned int aux = ~queriedNode+1;
    aux = queriedNode&aux;
    return queriedNode-aux;
}

inline uint getNext(uint queriedNode){
    unsigned int aux = ~queriedNode+1;
    aux = queriedNode&aux;
    return queriedNode+aux;
}

void update(int poz, int val){
    while(poz<=n){
        arbore[poz]+=val;
        poz=getNext(poz);
    }
}

uint query(int poz){
    uint sum=0;
    while(poz>0){
        sum+=arbore[poz];
        poz=getParent(poz);
    }
    return sum;
}

int binSearch(int sumToFind){
    int m,left=1,right=n,best=-1;
    while(left<=right){
        int m=(left+right)/2;
        int aux=query(m);
        if(aux==sumToFind){
            best=m;
            right=m-1;
        }
        else if(aux<sumToFind)left=m+1;
        else right=m-1;
    }
    return best;
}

int main()
{
    int x,y,caz;
    fin>>n>>m;
    arbore.resize(n+1);

    for(int i = 1;i<=n;i+=1){fin>>x;update(i,x);}
    for(;m;m-=1){
        fin>>caz;
        switch(caz){
        case 0:
            fin>>x>>y;
            update(x,y);
            break;
        case 1:
            fin>>x>>y;
            fout<<query(y)-query(x-1)<<'\n';
            break;
        case 2:
            fin>>x;
            fout<<binSearch(x)<<'\n';
        }
    }
}