Pagini recente » Cod sursa (job #971035) | Cod sursa (job #1884237) | Cod sursa (job #2132276) | Cod sursa (job #3224226) | Cod sursa (job #2819552)
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int MAXN = 100000;
const int MAXL = 17;
int ultimulBitSem( int x ){
return x & ( -1 * x );
}
int v[MAXN + 1];
int aib[MAXN + 1];
void built( int n ){
int i;
for( i = 1; i <= n; i++ ){
aib[i] += v[i];
//out<<"functie: ";
if( i + ultimulBitSem(i) <= n )
aib[i + ultimulBitSem(i)] += aib[i];
//out<<i<<" "<<aib[i]<<" "<<" "<<i + ultimulBitSem(i)<<" "<<aib[i + ultimulBitSem(i)]<<'\n';
}
}
int query(int x){
int sum;
sum = 0;
while(x){
sum += aib[x];
x -= ultimulBitSem(x);
}
return sum;
}
void update(int pos, int val, int n){
while( pos <= n ){
aib[pos] += val;
pos += ultimulBitSem(pos);
//cout<<pos<<'\n';
}
}
int cautPos( int val, int n ){
int sum, step, pos;
step = 1 << MAXL;
pos = 0;
sum = 0;
while( step ){
if( step + pos <= n && sum + aib[step + pos] <= val ){
pos += step;
sum += aib[pos];
}
step /= 2;
}
if( sum == val )
return pos;
return -1;
}
int main(){
int n, m, c, a, b, i;
in>>n>>m;
for( i = 1; i <= n; i++ )
in>>v[i];
built(n);
for( i = 0; i < m; i++ ){
in>>c>>a;
if( c == 0 ){
in>>b;
update(a, b, n);
//cout<<"am trecut"<<'\n';
}
if( c == 1 ){
in>>b;
//out<<"cerinta 1: "<<a<<" "<<b<<'\n';
//out<<query(b)<<" "<<query(a - 1)<<'\n';
out<<query(b) - query(a - 1)<<'\n';
}
if( c == 2 )
out<<cautPos(a, n)<<'\n';
}
return 0;
}