Pagini recente » Cod sursa (job #1736584) | Cod sursa (job #2425544) | Cod sursa (job #1756444) | Cod sursa (job #1184640) | Cod sursa (job #395053)
Cod sursa(job #395053)
//fuck it
#include <stdio.h>
#include <fstream>
using namespace std;
#define in "aib.in"
#define out "aib.out"
#define dim 100001
inline int Minim(int a, int b) {
if ( a < b ) return a;
return b;
}
int N, M, T;
int Arb[dim];
int C, S;
void Update(int,int);
int Query(int);
int Search(int);
int main()
{
memset(Arb,0,sizeof(Arb));
int K, X, Y;
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d%d", &N, &M);
for ( int i = 1; i <= N; i++ )
{
scanf("%d", &T);
Update(i,T);
}
for ( ; M; M-- )
{
scanf("%d", &K);
if ( K < 2 )
{
scanf("%d%d", &X, &Y);
if ( !K ) Update(X,Y);
else printf("%d\n", Query(Y)-Query(X-1));
}
else
{
scanf("%d", &X);
printf("%d\n", Search(X));
}
}
}
int Search(int val)
{
int i, step;
for ( step = 1; step < N; step <<= 1 );
for( i = 0; step; step >>= 1 )
{
if( i + step <= N)
{
if( val >= Arb[i+step] )
{
i += step, val -= Arb[i];
if ( !val ) return i;
}
}
}
return -1;
}
void Update(int poz, int val)
{
C = 0;
while ( poz <= N )
{
Arb[poz] += val;
while ( !(poz & (1<<C)) ) C++;
poz += (1<<C);
C += 1;
}
}
int Query(int poz)
{
C = 0, S = 0;
while ( poz > 0 )
{
S += Arb[poz];
while ( !(poz & (1<<C)) ) C++;
poz -= (1<<C);
C += 1;
}
return S;
}
//#include <iostream>
//#include <fstream>
//#include <vector>
//
//using namespace std;
//
//vector<long int> suma;
//void adauga(long int i,long int n,long int max){
// while(i<=max){
// suma[i]+=n;
// i+=(i&(-i));
// }
//}
//long int sum(long int i){
// long int n=0;
//
// while(i>0){
// n+=suma[i];
// i-=(i&(-i));
// }
// return n;
//}
//long int minim(long int a,long int max){
// long int i=0;
// long int p=1;
// while(p<=max)p*=2;
// p/=2;
//
// while(i+p<=max and p){
// long int mid=i+p;
// if(suma[mid]<=a){
// i=mid;
// a-=suma[mid];
// }
// p/=2;
// }
//
// if(a!=0) return -1;
// else return i;
//}
//
//int main(){
// ifstream in("aib.in");
// ofstream out("aib.out");
//
//
// long int n,m;
// in>>n>>m;suma=vector<long int>(n+1,0);
//
//
// for(long int i=0;i<n;i++){
// long int temp;
// in>>temp;
// adauga(i+1,temp,n);
// }
// for(long int i=0;i<m;i++){
// long int c;
// in>>c;
// switch(c){
// long int a,b;
// case 0:
// in>>a>>b;
// adauga(a,b,n);
// break;
// case 1:
// in>>a>>b;
// out<<sum(b)-sum(a-1)<<"\n";
// break;
// case 2:
// in>>a;
// out<<minim(a,n)<<"\n";
// break;
// }
// }
//
//}
//
//
//
//
//
//
//
//
//
//
//
//
//
//