Pagini recente » Cod sursa (job #1083177) | Diferente pentru problema/xp intre reviziile 15 si 10 | Cod sursa (job #2395480) | Monitorul de evaluare | Cod sursa (job #1439471)
#include <cstdio>
#include <fstream>
#include<cstring>
using namespace std;
FILE *f=fopen("aib.in", "r");
FILE *g=fopen("aib.out", "w");
int v[100001], c, n, m, s, t;
inline int Minim(int a, int b) {
if (a< b)
return a;
return b;
}
int searchk(int val){
int i, step;
for(step=1; step<n; step=step<<1);
for(i=0; step; step=step>>1)
if(i+step<=n)
if(val>=v[i+step]){
i+=step, val-=v[i];
if(val==0)
return i;
}
return -1;
}
void add(int poz, int val){
c=0;
while(poz<=n){
v[poz]+=val;
while(!(poz&(1<<c)))
++c;
poz+=(1<<c);
c+=1;
}
}
int Q(int poz){
c=0, s=0;
while(poz>0){
s+=v[poz];
while(!(poz&(1<<c)))
++c;
poz-=(1<<c);
c+=1;
}
return s;
}
int main()
{
int k, x, y;
fscanf(f, "%d%d", &n, &m);
for(int i=1; i<=n; ++i){
fscanf(f, "%d", &t);
add(i,t);
}
for(int i=1; i<=m; ++i){
fscanf(f, "%d", &k);
if (k<2){
fscanf(f, "%d%d", &x, &y);
if(k==0)
add(x,y);
else
fprintf(g, "%d\n", Q(y)-Q(x-1));
}
else{
fscanf(f, "%d", &x);
fprintf(g, "%d\n", searchk(x));
}
}
return 0;
}