Cod sursa(job #2454297)

Utilizator victoreVictor Popa victore Data 7 septembrie 2019 21:26:21
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
//check check check
//#include<iostream>
#include<vector>
#include<algorithm>
#include<fstream>
#include<queue>
#include<cstring>
#include<map>
#include<iomanip>

#define ll long long
#define pb(x) push_back(x)
#define zeros(x) ((x^(x-1))&x)

using namespace std;

typedef pair<int,int> ii;

const int NMAX = 1e5+5;

ifstream cin("aib.in");
ofstream cout("aib.out");

int N,M,aib[NMAX];

void add(int x,int quantity)
{
    int i;
    for(i = x ; i <= N ; i += zeros(i))
        aib[i] += quantity;
}

int compute(int x)
{
    int i,rez = 0;
    for(i = x ; i > 0 ; i -= zeros(i))
        rez += aib[i];
    return rez;
}

int main()
{
    int i,j,x;
    cin>>N>>M;
    for(i = 1 ; i <= N ; ++i)
    {
        cin>>x;
        add(i , x);
    }

    for(i = 1 ; i <= M ; ++i)
    {
        int a,b,c;
        cin>>a;
        if(a == 0)
            cin>>b>>c , add(b , c);
        else if(a == 1)
        {
            cin>>b>>c;
            cout<<compute(c) - compute(b-1);
        }
        else
        {
            cin>>b;
            int step;
            for(step = 1 ; step < N ; step<<=1);

            for(j = N ; step ; step>>=1)
                if(j - step >= 0 && compute(j - step) >= b)
                    j -= step;
            if(compute(j) == b)
                cout<<j;
            else
                cout<<"-1";
        }
        if(a != 0)
            cout<<"\n";
    }

    return 0;
}