Pagini recente » Cod sursa (job #1473140) | Cod sursa (job #1968567) | Cod sursa (job #339807) | Cod sursa (job #1248109) | Cod sursa (job #2812732)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
/**
AIB = arbore indexat binar - BIT (binary indexed tree) - Fenwick Tree
1. update pe un sufix cu o functie f
2. query pe un element
**/
/// LSB = least significant bit = cel mai mic bit activ
/// lsb(8) = 8
/// lsb(25) = 1
/// lsb(-1) = 1 ; reprezentarea nr negative: bit de semn+restul bitilor
/// -1 in baza 2 : 1111...1
auto GetNegation = [](int x){
/// inversam bitii si adaugam 1
return (~x)+1;
};
#define lsb(X) ((X) & -(X))
const int NMAX=100002;
int aib[NMAX];
void Update( int poz, int val ){
while( poz<NMAX ){
aib[poz] += val;
poz += lsb(poz);
}
}
long long Query( int poz ){
long long suma=0;
while(poz){
suma+=aib[poz];
poz-=lsb(poz);
}
return suma;
}
/*
void UpdateOnSegment( int st, int dr, int val ){
Update( st, val );
Update( dr+1, -val );
} */
/** aib pe 2D**/
int main()
{
int n, m;
in>>n>>m;
int val;
for(int i=1; i<=n; i++){
in>>val;
Update( i, val );
}
int op, x, y;
for(int i=1; i<=m; i++){
in>>op;
if( op==0 ){
in>>x>>y;
Update( x, y );
//out<<"update "<<aib[x]<<'\n';
}
if( op==1 ){
in>>x>>y;
long long rez = Query( y ) - Query( x-1 );
out<<rez<<'\n';
}
if( op==2 ){
in>>x;
//out<<"caut bin ";
int p=1, poz;
while(p<=n)
p=p*2;
for(poz=0; p>0; p=p/2){
if(poz+p<=n && Query(poz+p)<x)
poz=poz+p;
}
if( Query(poz+1)==x )
out<<poz+1<<'\n';
else
out<<-1<<'\n';
}
}
return 0;
}