Cod sursa(job #2889544)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 12 aprilie 2022 22:07:04
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
//Ilie Dmitru
#include<fstream>
#include<cstdio>
typedef long long int ll;
const int NMAX=100005;
const ll MOD=194767;

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

int N, AIB[NMAX], v[NMAX];

void createAIB()
{
    int i;
    for(i=1;i<=N;++i)
    {
        AIB[i]+=v[i];
        if(i+(i&-i)<=N)
            AIB[i+(i&-i)]+=AIB[i];
    }
}

void op1(int index, int add)
{
    while(index<=N)
    {
        AIB[index]+=add;
        index+=index&-index;
    }
}

int query(int index)
{
    int s=0;
    while(index)
    {
        s+=AIB[index];
        index^=index&-index;
    }
    return s;
}

int op2(int a, int b) {return query(b)-query(a-1);}

int op3(int sum)
{
    int index=0, bit=N;
    while(bit&(bit-1))
        bit^=bit&-bit;
    for(;bit;bit>>=1)
    {
        if(index+bit<=N && sum-AIB[index+bit]>-1)
        {
            index+=bit;
            sum-=AIB[index];
        }
    }
    if(sum)
        return -1;
    return index;
}

int main()
{
    int M, i, op, a, b;
    fscanf(f, "%d%d", &N, &M);
    for(i=1;i<=N;++i)
        fscanf(f, "%d", v+i);
    createAIB();
    for(i=0;i<M;++i)
    {
        fscanf(f, "%d%d", &op, &a);
        switch(op)
        {
        case 0:
            fscanf(f, "%d", &b);
            op1(a, b);
            break;
        case 1:
            fscanf(f, "%d", &b);
            fprintf(g, "%d\n", op2(a, b));
            break;
        case 2:
            fprintf(g, "%d\n", op3(a));
            break;
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}