Cod sursa(job #2731592)

Utilizator emanuel2186Lugojan Emanuel emanuel2186 Data 27 martie 2021 22:58:51
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N, M;
int AIB[Nmax];
int v[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 K, found;
void det_minim(int left, int right, int val)
{
    if(left <= right && found == 0)
    {
        int mid = (left + right) / 2;
        int s = suma(mid);
        if(left == right)
            found = 1;
        else
            found = 0;
        if(s == val)
        {
            K = mid;
            found = 1;
        }
        else
        {
            if(s < val)
            {
                det_minim(mid + 1, right, val);
            }
            else
            {
                det_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 == 2)
        {
            found = 0;
            K = -1;
            det_minim(1, N, a);
            fout<<K<<"\n";
        }
        else
        {
            fin>>b;
            if(cer == 0)
            {
                adaug(a, b);
            }
            else
            {
                fout<<suma(b) - suma(a - 1)<<"\n";
            }
        }
    }
}
int main()
{
    citire();
    return 0;
}