Cod sursa(job #2387885)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 25 martie 2019 12:43:34
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int N=100000+7;

int n,m;
int aib[N];

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

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

int main()
{
        freopen("aib.in","r",stdin);
        freopen("aib.out","w",stdout);
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
                int x;
                cin>>x;
                add(i,x);
        }
        while(m--)
        {
                int t,x;
                cin>>t>>x;
                if(t==0)
                {
                        int y;
                        cin>>y;
                        add(x,y);
                }
                if(t==1)
                {
                        int y;
                        cin>>y;
                        cout<<get(y)-get(x-1)<<"\n";
                }
                if(t==2)
                {
                        int r=0,pas=(1<<17),cur=0;
                        while(pas)
                        {
                                if(r+pas<=n && cur+aib[r+pas]<x)
                                {
                                        r+=pas;
                                        cur+=aib[r];
                                }
                                pas>>=1;
                        }
                        r++;
                        if(r<=n && get(r)==x)
                        {
                                cout<<r<<"\n";
                        }
                        else
                        {
                                cout<<"-1\n";
                        }
                }
        }
        return 0;
}