Cod sursa(job #3185261)

Utilizator matei__bBenchea Matei matei__b Data 18 decembrie 2023 17:12:45
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ld long double
#define chad char
#define mod 1'000'000'009
#define dim 100005
#define lim 1000000
#define mdim 1501
#define mult 2e9
#define maxx 200002
#define simaimult 1e17
#define FOR(i,a,b) for(int i=(a); i<=(b); i++)
#define pli pair<ll,int>
#define pil pair<int,ll>
#define piii pair<int,pair<int,int> > 
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define mp make_pair
#define nr_biti __builtin_popcount
using namespace std;
 
ifstream fin("aib.in");
ofstream fout("aib.out");

int n,q;

struct fenw 
{
    vector<int> aib;
    int n;

    void init(int _n)
    {
        n=_n;
        aib=vector<int>(_n+4,0);
    }

    void update(int pos,int val)
    {
        for(int i=pos; i<=n; i+=(i&-i))
            aib[i]+=val;
    }

    int query(int pos)
    {
        if(!pos)
            return 0;

        int ans=0;

        for(int i=pos; i; i-=(i&-i))
            ans+=aib[i];

        return ans;
    }

}v;

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr); 

    fin >> n >> q;

    v.init(n);

    for(int i=1; i<=n; i++)
    {
        int x;
        fin >> x;
        v.update(i,x);
    }

    while(q--)
    {
        int tip;
        int st,dr;

        fin >> tip;

        if(tip==0)
        {
            fin >> st >> dr;
            v.update(st,dr);
        }
        else if(tip==1)
        {
            fin >> st >> dr;
            fout << v.query(dr)-v.query(st-1) << "\n";
        }
        else 
        {
            fin >> st;

            int l=1,r=n;
            int pp=n;

            while(l<=r)
            {
                int mij=(l+r)/2;

                if(v.query(mij)<=st)
                {
                    pp=mij;
                    l=mij+1;
                }
                else 
                    r=mij-1;
            }

            if(v.query(pp)==st)
                fout << pp << "\n";
            else 
                fout << -1 << "\n";
        }
    }

    return 0;
}