Cod sursa(job #2270710)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 27 octombrie 2018 13:55:59
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;

const int N=100000+5;

int n,q,aib[N];

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

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

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        update(i,x);
    }
    while(q--)
    {
        int t;
        cin>>t;
        if(t==0)
        {
            int x,y;
            cin>>x>>y;
            update(x,y);
        }
        if(t==1)
        {
            int x,y;
            cin>>x>>y;
            cout<<prefix(y)-prefix(x-1)<<"\n";
        }
        if(t==2)
        {
            int x;
            cin>>x;
            int r=0,pas=(1<<16);
            int sum=0;
            while(pas)
            {
                if(r+pas<=n && sum+aib[r+pas]<x)
                {
                    r+=pas;
                }
                pas>>=1;
            }
            r++;
            if(1<=r && r<=n && prefix(r)==x)
            {
                cout<<r<<"\n";
            }
            else
            {
                cout<<"-1\n";
            }
        }
    }
    return 0;
}