Pagini recente » Cod sursa (job #174378) | Cod sursa (job #586923) | Cod sursa (job #1504922) | Cod sursa (job #3249472) | Cod sursa (job #905499)
Cod sursa(job #905499)
#include<cstdio>
#define MAX_SIZE 100005
using namespace std;
int S[MAX_SIZE],N,M;
int x,tip,a,b;
void update( int poz ,int val )
{
for(int i=poz; i <= N; i+=i&(-i))
S[i]+=val;
}
int query ( int val)
{
int result=0;
for(int i= val ; i ; i-=i&(-i) )
result+=S[i];
return result;
}
inline int search( int sum )
{
int left=1,right=N+1;
int mid;
int s;
while( left <= right )
{
mid=(left+right)>>1;
s=query(mid);
if( s > sum )
{
right=mid-1;
continue;
}
if(s < sum )
{
left=mid+1;
continue;
}
if( s== sum)
return mid;
}
return -1;
}
int main( void )
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i(1); i <= N ; ++i)
{
scanf("%d",&x);
update(i,x);
}
for(int i(1); i <= M ; ++i)
{
scanf("%d",&tip);
if( tip == 0 )
{
scanf("%d%d",&a,&b);
update(a,b);
continue;
}
if( tip == 1)
{
scanf("%d%d",&a,&b);
printf("%d\n",query(b)-query(a-1));
continue;
}
if( tip == 2)
{
scanf("%d",&a);
printf("%d\n",search(a));
continue;
}
}
return 0;
}