Pagini recente » Cod sursa (job #320496) | Cod sursa (job #290601) | Cod sursa (job #1380267) | Cod sursa (job #775478) | Cod sursa (job #1375027)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <iostream>
#define NMAX 100005
#define lsb(i) i&(-i)
#define get_max(a,b) ((a)>(b)?(a):(b))
#define get_min(a,b) ((a)<(b)?(a):(b))
using namespace std;
ifstream in ( "aib.in" );
ofstream out ( "aib.out" );
int N , M ;
int AIB[NMAX];
void Update ( int Pos , int Value ){
int i;
for ( i = Pos ; i <= N ; i += lsb(i) )
AIB[i] += Value;
}
int Search ( int Pos ){
int Answer = 0 ;
int i ;
for ( i = Pos ; i > 0 ; i -= lsb(i ))
Answer += AIB[i];
return Answer;
}
int BinarySearch ( int A ){
int left = 1 , Sol , right = N , value ;
int middle = ( 1 + N ) / 2;
bool ok = true;
while ( left <= right ){
middle = ( left +right ) / 2;
value = Search( middle );
if ( value == A )
return middle; else
if ( value > A) right = middle - 1;
else if ( value < A)left = middle +1;
}
return -1;
}
int main ( void ){
int i , j ;
int type , A , B;
in >> N >> M ;
for ( i = 1 ; i <= N ; ++i )
in >> A,
Update ( i , A);
for ( i = 1 ; i <= M ; ++i ){
in >> type >> A;
if ( type == 2 ){
out << BinarySearch(A) << "\n";
}else{
in >> B;
if ( type == 1 )
out << Search(B) - Search(A-1) << "\n";
else Update ( A , B) ;
}
}
in.close();
out.close();
return 0 ;
}