Pagini recente » Cod sursa (job #1598247) | Cod sursa (job #2050757) | Cod sursa (job #1694124) | Cod sursa (job #664067) | Cod sursa (job #751541)
Cod sursa(job #751541)
#include <cstdio>
#include <algorithm>
using namespace std;
#define TEST 1
#define MAX 100001
int aib[MAX],n,m;
void open(){
if(TEST)
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
} else {
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
}
}
void update(int idx,int val){
while(idx<=n)
{
aib[idx]+=val;
idx+=idx&-idx;
}
}
int read(int idx){
int sum = 0;
while(idx > 0)
{
sum+=aib[idx];
idx-=idx&-idx;
}
return sum;
}
int caut_bin(int x){
int l = 1,r = n, md;
while(l < r)
{
md = (l + r) / 2;
if(read(md) >= x)r = md; else l = md + 1;
}
return read(r) == x ? r : -1;
}
int main(){
int c,x,y;
open();
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",&c);
if(c == 2)
{
scanf("%d",&x);
printf("%d\n",caut_bin(x));
} else {
scanf("%d %d",&x,&y);
if(c == 0)update(x,y); else printf("%d\n",read(y)-read(x-1));
}
}
return 0;
}