Cod sursa(job #2755652)

Utilizator MenelausSontea Vladimir Menelaus Data 27 mai 2021 22:18:34
Problema Arbori indexati binar Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <stdio.h>

//std::ifstream in("aib.in");
//std::ofstream out("aib.out");

FILE *fin, *fout;

const int N=100000;

int v[N+1];
int AIB[N+2];

int parent(int i)
{
    return i-(i&(-i));
}

int frate_vecin(int i)
{
    return i+(i&(-i));
}

void update(int poz, int dif, int n)
{
    v[poz]+=dif;

    int casuta=poz+1;
    while(casuta<=n+1)
    {
        AIB[casuta]+=dif;
        casuta=frate_vecin(casuta);
    }
}

int sum(int poz)
{
    int s=0;

    int casuta=poz+1;
    while(casuta!=0)
    {
        s+=AIB[casuta];
        casuta=parent(casuta);
    }

    return s;
}

int interogare(int suma, int n)
{
    int st=1, dr=n+1, mij, k;

    while(st+1!=dr)
    {
        mij=(st+dr)/2;

        if(sum(mij)<suma)
        {
            st=mij+1;
        }
        else
        {
            dr=mij;
        }
    }

    if(sum(st)!=suma) return -1;

    return st;
}

int main()
{
    fin=fopen("aib.in", "r");
    fout=fopen("aib.out", "w");

    int n, m, x, l, r;

    fscanf(fin, "%d%d", &n, &m);
    for(int i=1; i<=n; i++)
    {
        fscanf(fin, "%d", &x);
        update(i, x, n);
    }

    for(int i=1; i<=m; i++)
    {
        fscanf(fin, "%d", &x);

        switch(x)
        {
        case 0:

            fscanf(fin, "%d%d", &l, &r);
            update(l, r, n);
            break;

        case 1:
            fscanf(fin, "%d%d", &l, &r);
            fprintf(fout, "%d\n", sum(r)-sum(l-1));
            break;

        case 2:
            fscanf(fin, "%d", &x);
            fprintf(fout, "%d\n", interogare(x, n));
            break;
        }
    }
}