Cod sursa(job #2940986)

Utilizator matei0000Neacsu Matei matei0000 Data 16 noiembrie 2022 21:18:15
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>

using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
long long aib[100005];
int n;
void fct0(int a, int b)
{
    for(int i=a;i<=n;i+=(i&-i))
        aib[i]+=b;
}
int query(int a)
{
    int ras=0;
    for(int i=a;i>0;i-=(i&-i))
        ras+=aib[i];
    return ras;
}
int fct2(int a)
{
    if(a==0)
        return -1;
    int pas=(1<<17),sum=0,poz=0;
    while(pas>0)
    {
        if(poz+pas<=n && sum+aib[poz+pas]<=a)
        {
            poz+=pas;
            sum+=aib[poz];
        }
        pas/=2;
    }
    if(sum==a)
        return poz;
    return -1;
}
int main()
{
    int m,x;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        fct0(i,x);
    }
    for(int i=0;i<m;i++)
    {
        int cer,a,b;
        cin>>cer;
        if(cer==0)
        {
            cin>>a>>b;
            fct0(a,b);
        }
        if(cer==1)
        {
            cin>>a>>b;
            cout<<query(b)-query(a-1)<<'\n';
        }
        if(cer==2)
        {
            cin>>a;
            cout<<fct2(a)<<'\n';
        }
    }
    return 0;
}