Cod sursa(job #3247063)

Utilizator Andreea3425Diaconu Andreea Andreea3425 Data 5 octombrie 2024 14:37:11
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <vector>

using namespace std;

#define N 100000

int aib[N+1];

void update (int n, int i, int a){
    while (i<=n){
        aib[i]+=a;
        i+=i&-i;
    }
}

int sum (int n, int i){
    int s=0;
    while (i>0){
        s+=aib[i];
        i-=i&-i;
    }
    return s;
}

int main()
{
    FILE *fin, *fout;
    int n,q,i,cer,a,b,st,dr,mij;
    fin=fopen("aib.in", "r");
    fscanf(fin, "%d%d", &n, &q);
    for (i=1; i<=n; i++){
        fscanf(fin, "%d", &a);
        update(n, i, a);
    }
    fout=fopen("aib.out", "w");
    for (i=0; i<q; i++){
        fscanf(fin, "%d%d", &cer, &a);
        if (cer<2){
            fscanf(fin, "%d", &b);
            if (cer==0)
                update(n, a, b);
            else
                fprintf(fout, "%d\n", sum(n, b)-sum(n, a-1));
        }else{
            st=1;
            dr=n+1;
            while (st<dr){
                mij=(st+dr)/2;
                if (sum(n, mij)<a)
                    st=mij+1;
                else
                    dr=mij;
            }
            if (aib[st]==a)
                fprintf(fout, "%d\n", st);
            else
                fprintf(fout, "-1\n");
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}