Cod sursa(job #1819353)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 30 noiembrie 2016 15:44:48
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <vector>
using namespace std;


int n,m;
vector<int> aib;

void add(int p, int v){
    while(p<=n){
        aib[p]+=v;
        p += p&-p;
    }
}

int sum(int p){
    if(p==0||p>n) return 0;

    int s=0;
    while(p){
        s+=aib[p];
        p -= p&-p;
    }
    return s;
}

int finds(int s){
    int mask=1<<30;
    while(mask>n) mask>>=1;

    int poz=0;
    for(;mask;mask>>=1){
        if((poz|mask)<=n && aib[poz|mask]<=s){
            poz|=mask;
            s-=aib[poz];
        }
    }


    if(s==0 &&poz) return poz;
    else return -1;
}



int main()
{
    ifstream fin("aib.in");
    ofstream fout("aib.out");

    fin>>n>>m;
    aib.resize(n+1,0);

    for(int i=1;i<=n;++i){
        int x; fin>>x;
        add(i,x);
    }

    for(int i=0;i<m;++i){
        int c,a,b; fin>>c>>a;
        if(c==0){
            fin>>b;
            add(a,b);
        }
        else if(c==1){
            fin>>b;
            fout<<sum(b)-sum(a-1)<<'\n';
        }
        else{
            fout<<finds(a)<<'\n';
        }
    }


    return 0;
}