Cod sursa(job #2273681)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 31 octombrie 2018 20:39:37
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int N=100000+5;
int n,q;
int aib[N];

inline void add(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()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        add(i,x);
    }
    for(int tc=1;tc<=q;tc++)
    {
        int type;
        cin>>type;
        if(type==0)
        {
            int a,b;
            cin>>a>>b;
            add(a,b);
        }
        if(type==1)
        {
            int a,b;
            cin>>a>>b;
            cout<<prefix(b)-prefix(a-1)<<"\n";
        }
        if(type==2)
        {
            int x;
            cin>>x;
            int r=0,pas=(1<<17);
            int cur=0;
            while(pas)
            {
                if(r+pas<=n && cur+aib[r+pas]<x)
                {
                    cur+=aib[r];
                    r+=pas;
                }
                pas/=2;
            }
            r++;
            /// cout<<r<<" "<<prefix(r)<<"\t";
            if(1<=r && r<=n && prefix(r)==x) cout<<r<<"\n";
            else cout<<"-1\n";
        }
    }
    return 0;
}