Cod sursa(job #1766754)

Utilizator andrei20003Ionescu Andrei andrei20003 Data 28 septembrie 2016 15:46:31
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>

using namespace std;

long long aib[1000010],n;

long long query(long long p) {
    long long rez=0,pow2;
    while (p!=0) {
        rez+=aib[p];
        pow2=(p&(-p));
        p-=pow2;
    }
    return rez;
}

void update(long long p,long long val) {
    int pow2;
    while (p<=n) {
        aib[p]+=val;
        pow2=(p&(-p));
        p+=pow2;
    }
}

long long search1(long long val) {
    long long i=0,pas=1<<16;
    while (pas!=0) {
        if (i+pas<=n && aib[i+pas]<=val) {
            i+=pas;
            val-=aib[i];
        }
        pas/=2;
    }
    if (val==0)
        return i;
    else
        return -1;
}

int main()
{
    FILE *fin,*fout;
    long long m,i,a,t,b;
    fin=fopen("aib.in","r");
    fout=fopen("aib.out","w");
    fscanf(fin,"%lld%lld", &n, &m);
    for (i=1;i<=n;i++) {
        fscanf(fin,"%d", &a);
        update(i,a);
    }
    for (i=1;i<=m;i++) {
        fscanf(fin,"%lld%lld", &t, &a);
        if (t<2)
            fscanf(fin,"%lld", &b);
        if (t==0)
            update(a,b);
        if (t==1)
            fprintf(fout,"%lld\n", query(b)-query(a-1));
        if (t==2)
            fprintf(fout,"%lld\n", search1(a));
    }
    return 0;
}