Cod sursa(job #2282678)

Utilizator I_am_not_a_robotMr Domino I_am_not_a_robot Data 14 noiembrie 2018 12:03:05
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

const int N=100000+5;

int n,t;
int aib[N];

inline void add(int p,int x)
{
    for(int i=p;i<=n;i+=i&(-i))
    {
        aib[i]+=x;
    }
}

inline int prefix(int p)
{
    int ans=0;
    for(int i=p;i>=1;i-=i&(-i))
    {
        ans+=aib[i];
    }
    return ans;
}



int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    cin>>n>>t;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        add(i,x);
    }
    for(int tc=1;tc<=t;tc++)
    {
        int hulk;
        cin>>hulk;
        if(hulk==0)
        {
            int a,b;
            cin>>a>>b;
            add(a,b);
        }
        if(hulk==1)
        {
            int a,b;
            cin>>a>>b;
            cout<<prefix(b)-prefix(a-1)<<"\n";
        }
        if(hulk==2)
        {
            int x;
            int now=0;
            cin>>x;
            int r=0,pas=(1<<19);
            while(pas)
            {
                if(r+pas<=n && now+aib[r+pas]<x)
                {
                    r+=pas;
                    now+=aib[r];
                }
                pas>>=1;
            }
            r++;
            if(1<=r && r<=n && prefix(r)==x)
            {
                cout<<r<<"\n";
            }
            else
            {
                cout<<"-1\n";
            }
        }
    }
    return 0;
}