Cod sursa(job #395035)

Utilizator csizMocanu Calin csiz Data 11 februarie 2010 23:19:40
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

vector<int> suma;
void adauga(int i,int n,int max){
    while(i<=max){
        suma[i]+=n;
        i+=(i&(-i));
    }
}
int sum(int i){
    int n=0;

    while(i>0){
        n+=suma[i];
        i-=(i&(-i));
    }
    return n;
}
int minim(int a,int max){
    int i=0;
    int p=1;
    while(p<=max)p*=2;
    p/=2;

    while(i<=max and p){
        int mid=i+p;
        if(suma[mid]==a) return mid;
        else if(suma[mid]<a){
            i=mid;
            a-=suma[mid];
        }
        p/=2;
    }
    if(a) return -1;
    else return i;
}

int main(){
    ifstream in("aib.in");
    ofstream out("aib.out");


    int n,m;
    in>>n>>m;suma=vector<int>(n+1,0);


    for(int i=0;i<n;i++){
        int temp;
        in>>temp;
        adauga(i+1,temp,n);
    }
    for(int i=0;i<m;i++){
        int c;
        in>>c;
        switch(c){
            int a,b;
            case 0:
            in>>a>>b;
            adauga(a,b,n);
            break;
            case 1:
            in>>a>>b;
            out<<sum(b)-sum(a-1)<<"\n";
            break;
            case 2:
            in>>a;
            out<<minim(a,n)<<"\n";
            break;
        }
    }

}