Cod sursa(job #554920)

Utilizator mihaimoldovanMihai Moldovan mihaimoldovan Data 15 martie 2011 10:32:00
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream>
using namespace std;
#define nn 100001
int a[nn],n,m,t;
void adaugare(int poz,int val){
    int c=0;
    while(poz<=n){
        a[poz]+=val;
        while(!(poz&(1<<c))) ++c;//daca al c-lea bit al lui poz este 0 c creste
        poz+=(1<<c);
        ++c;
    }
}
int suma(int poz){
    int s=0,c=0;
    while(poz>0){
    s+=a[poz];
    while(!poz&(1<<c)) ++c;//daca al c-lea bit al lui poz este 0 c creste
    poz-=(1<<c);//din poz se scade valoarea 2 la puterea c
    ++c;//c creste
    }
}
int cautare(int k){
    int i,pas;
    for(pas=1;pas<n;pas<<=1)
    for(i=0;pas;pas>>=1){
        if(i+pas<=n){
            if(k >= a[i+pas]){
                i+=pas, k-=a[i];
                if(!k) return i;
            }
        }
    }
    return -1;
}
int main(){

    int i,x,y,z;
    memset(a,0,sizeof(a));
    ifstream fin("aib.in");
    FILE *f=fopen("aib.out","w");
    fin>>n>>m;
    for(i=1;i<=n;++i){
        fin>>x;
        adaugare(i,x);
    }
    for(i=1;i<=m;++i){
        fin>>x;
        if(x<2){
            fin>>y>>z;
            if(x==0) adaugare(y,z);
            else
                fprintf(f,"%d\n",suma(z)-suma(y-1));//intervalul [a,b]
        }
        else{
            fin>>y;
            fprintf(f,"%d\n",cautare(y));
        }
    }
    return 0;
}