Cod sursa(job #2118368)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 30 ianuarie 2018 16:30:37
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 100001

using namespace std;

int n,m,ans,a,b,o;
vector<int> v,arb;
void construieste(int st,int dr,int pos){
  if(st==dr){
    arb[pos]=v[st];
    return;
  }
  int m=(st+dr)/2;
  construieste(st,m,pos*2);
  construieste(m+1,dr,pos*2+1);
  arb[pos]=arb[pos*2]+arb[pos*2+1];
}
void adauga(int st,int dr,int pos){
  if(st>a||dr<a)return;
  arb[pos]+=b;
  if(st==dr)return;
  int m=(st+dr)/2;
  adauga(st,m,pos*2);
  adauga(m+1,dr,pos*2+1);
}
void suma(int st,int dr,int pos){
  if(st>=a&&dr<=b){
    ans+=arb[pos];
    return;
  }
  if(st>b||dr<a||st==dr)return;
  int m=(st+dr)/2;
  suma(st,m,pos*2);
  suma(m+1,dr,pos*2+1);
}
void query(int st,int dr,int pos,int val){
  if(val<0||arb[pos]<val)return;
  if(val==arb[pos]){
    ans=dr;
    return;
  }
  if(st==dr)return;
  int m=(st+dr)/2;
  query(st,m,pos*2,val);
  query(m+1,dr,pos*2+1,val-arb[pos*2]);
}

int main()
{
    ifstream f ("aib.in");
    ofstream g ("aib.out");
    f>>n>>m; v.resize(n+10);arb.resize(n*4+10);
    for(int i=1;i<=n;i++)f>>v[i];
    construieste(1,n,1);
    for(int i=1;i<=m;i++){
      f>>o;
      if(o==0){
        f>>a>>b;
        adauga(1,n,1);
      } else if(o==1){
        f>>a>>b;
        ans=0;
        suma(1,n,1);
        g<<ans<<'\n';
      } else {
        f>>a;
        ans=0;
        query(1,n,1,a);
        if(ans)g<<ans<<'\n';
        else g<<"-1\n";
      }
    }
    f.close ();
    g.close ();
    return 0;
}