Cod sursa(job #2660271)

Utilizator emanuel2186Lugojan Emanuel emanuel2186 Data 18 octombrie 2020 17:48:28
Problema Arbori indexati binar Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N, M;
int v[NMAX];
int AIB[NMAX];
void build()
{
    for(int i=1; i<=N; i++)
    {
        for(int j=i; j> i - (i & -i); j--)
        {
            AIB[i] += v[j];
        }
    }
}
void adaug(int poz, int val)
{
    for(int i=poz; i<=N; i += (i & -i))
    {
        AIB[i] += val;
    }
}
int suma(int poz)
{
    int S = 0;
    for(int i = poz; i>=1; i -= (i & -i))
    {
        S += AIB[i];
    }
    return S;
}
int rez = 0;
void pozitie_minim(int left, int right, int val)
{
    if (left < right)
    {
        int mid = (left + right) / 2;
        int S = suma(mid);
        if (S == val)
        {
            rez = mid;
        }
        if (S < val)
        {
            pozitie_minim(mid + 1, right, val);
        }
        else
        {
            pozitie_minim(left, mid, val);
        }
    }
}
void citire()
{
    fin>>N>>M;
    for(int i=1; i<=N; i++)
    {
        fin>>v[i];
    }
    int cer, a, b;
    build();
    for(int i=1; i<=M; i++)
    {
        fin>>cer>>a;
        if (cer == 0)
        {
            fin>>b;
            adaug(a, b);
        }
        else
        {
            if (cer == 1)
            {
                fin>>b;
                fout<<suma(b) - suma(a - 1)<<"\n";
            }
            else
            {
                rez = -1;
                pozitie_minim(1, N, a);
                fout<<rez<<"\n";

            }
        }
    }
}
int main()
{
    citire();
    return 0;
}