Cod sursa(job #1207011)

Utilizator tudi98Cozma Tudor tudi98 Data 11 iulie 2014 18:47:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
using namespace std;
#define dim 100001

int AIB[dim],n,m;

void update(int Val,int idx){
    while(idx<=n){
        AIB[idx]+=Val;
        idx+=(idx & -idx);
    }
}

int query(int idx){
    int sum=0;
    while(idx>0){
        sum+=AIB[idx];
        idx-=(idx & -idx);
    }
    return sum;
}

int find(int cumfre){
  int step=1,i=0;
  for(step;step<n;step<<=1);
  for(;step;step>>=1)
    if(i+step<=n && AIB[i+step]<=cumfre){
        cumfre-=AIB[i+step];
        i+=step;
        if(!cumfre) return i;
    }
  return -1;
}

int main(){

    ifstream f("aib.in");
    ofstream g("aib.out");

    int x,y,t;
    f >> n >> m;
    for(int i=1;i<=n;i++){
        f >> x;
        update(x,i);
    }
    while(m--){
        f >> t;
        if(t==0){
            f >> x >> y;
            update(y,x);
        }
        else if(t==1){
            f >> x >> y;
            g << query(y)-query(x-1) << "\n";
        }
        else{
            f >> x;
            g << find(x) <<"\n";
        }
    }
}