Cod sursa(job #1264028)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 15 noiembrie 2014 14:32:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>

using namespace std;

int n,aib[100000];

void update (int poz,int val){
    for (;poz<=n;poz=poz+(poz &(poz-1)^poz))
      aib[poz]+=val;
}

int querry (int poz){
    int s;
    s=0;
    for(;poz;poz=poz-(poz &(poz-1)^poz))
      s=s+aib[poz];
    return s;

}
int search(int val){
    int i, poz;
    for (poz=1;poz<n;poz<<=1);
    for(i=0;poz;poz/=2){
         if(i+poz<=n){
            if(val>=aib[i+poz]){
                i+=poz;
                val-=aib[i];
                if (!val)
                  return i;
            }
         }
    }
    return -1;
}
int main(){
    FILE *fin, *fout;
    int i,a,b,tip,m;
    fin=fopen("aib.in","r");
    fscanf(fin,"%d%d",&n,&m);
    for (i=1;i<=n;i++){
        fscanf(fin,"%d",&a);
        update(i,a);
    }
    fout=fopen("aib.out","w");
    for (i=0;i<m;i++){
        fscanf(fin,"%d",&tip);
        if (tip<2){
            fscanf(fin,"%d%d",&a,&b);
            if (tip==0)
                update(a,b);
            else
                fprintf(fout,"%d\n",querry(b)-querry(a-1));
        }
        else {
            fscanf(fin,"%d",&a);
            fprintf(fout,"%d\n",search(a));
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}