Cod sursa(job #1960632)

Utilizator mateibanuBanu Matei Costin mateibanu Data 10 aprilie 2017 16:26:05
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>

using namespace std;

FILE*f=fopen("aib.in","r");
FILE*g=fopen("aib.out","w");

int arb[100008];
int n;

void adauga(int p, int a){
    int b=0;
    while (p<=n){
        arb[p]+=a;
        b=(p&(p-1))^p;
        p+=b;
    }
}

int suma(int p){
    int b=0,s=0;
    while (p>0){
        s+=arb[p];
        b=(p&(p-1))^p;
        p-=b;
    }
    return s;
}

int cauta(int s){
    int p=1,u=n,mij,smij;
    while (p<=u){
        mij=(p+u)/2;
        smij=suma(mij);
        if (smij==s) return mij;
        if (smij<s) p=mij+1;
        else u=mij-1;
    }
    return -1;
}

int main()
{
    int m,a,b,p,i;
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=n;i++){
        fscanf(f,"%d",&a);
        adauga(i,a);
    }
    while (m){
        m--;
        fscanf(f,"%d",&p);
        if (p==2){
            fscanf(f,"%d",&a);
            fprintf(g,"%d\n",cauta(a));
        }
        else{
            fscanf(f,"%d%d",&a,&b);
            if (p==1){
                fprintf(g,"%d\n",suma(b)-suma(a-1));
            }
            else{
                adauga(a,b);
            }
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}