Cod sursa(job #2361097)

Utilizator DavidDragulinDragulin David DavidDragulin Data 2 martie 2019 12:58:15
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int N=100009;
int n,m;
long long a[N],aib[N];
void update(int x,int y)
{
    while(x<=n)
    {
        aib[x]+=y;
        x+=x&(-x);
    }
}
long long query(long long x)
{
    long long sum=0;
    while(x)
    {
        sum+=aib[x];
        x-=x&(-x);
    }
    return sum;
}
int query2(long long x)
{
    int st=1,dr=n,sol;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        long long ans=query(mij);
        if(ans==x)
            sol=mij;
        if(ans<x)
            st=mij+1;
        else
            dr=mij-1;
    }
    return sol;
}
void read()
{
    fin.sync_with_stdio(false);
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>a[i];
}
void solve()
{
    fin.sync_with_stdio(false);
    for(int i=1;i<=n;i++)
        update(i,a[i]);
    for(int i=1;i<=m;i++)
    {
        int caz,a,b;
        fin>>caz;
        if(caz==0)
        {
            fin>>a>>b;
            update(a,b);
        }
        else
            if(caz==1)
            {
                fin>>a>>b;
                fout<<query(b)-query(a-1)<<'\n';
            }
            else
            {
                fin>>a;
                fout<<query2(a)<<'\n';
            }
    }
}
int main()
{
    read();
    solve();
    return 0;
}