Cod sursa(job #1845714)

Utilizator GandalfTheWhiteGandalf the White GandalfTheWhite Data 11 ianuarie 2017 20:27:07
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#define N 100002
#define zeros(x) ((x^(x-1))&x)
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");

int n,m,aib[N];

inline void update(int pos,int value) {
for (int i=pos;i<=n;i+=zeros(i))
    aib[i]+=value;
}

inline int sum(int pos){
int s=0;
for (int i=pos;i>0;i-=zeros(i))
    s+=aib[i];
return s;
}

int main()
{
int i,x,type,a,b,lo,hi,mi;
fin>>n>>m;
for (i=1;i<=n;i++) {
    fin>>x;
    update(i,x);
    }
while (m--) {
     fin>>type;
     if (type==0) {
                   fin>>a>>b;
                   update(a,b);
                  }
     if (type==1) {
                   fin>>a>>b;
                   fout<<sum(b)-sum(a-1)<<'\n';
                  }
     if (type==2) {
                   fin>>a;lo=0;hi=n;
                   while (hi-lo-1)
                       {
                       mi=(hi+lo)/2;
                       if (sum(mi)>=a) hi=mi;
                       else lo=mi;
                       }
                   if (sum(hi)==a) fout<<hi<<'\n';
                   else fout<<"-1"<<'\n';
                  }
    }
return 0;
}