Pagini recente » Cod sursa (job #3167956) | Cod sursa (job #519746) | Cod sursa (job #2316645) | Cod sursa (job #1798053) | Cod sursa (job #2564095)
#include <iostream>
#include <cstdio>
using namespace std;
int v[100001], n;
int len(int x) {
return (x-(x&(x-1)));
}
void update(int poz, int val) {
while(poz<=n) {
v[poz]+=val;
poz+=len(poz);
}
}
int query1(int poz) {
int sum=0;
while(poz>0) {
sum+=v[poz];
poz-=len(poz);
}
return sum;
}
int query2(int val) {
int rez=0, pas=(1<<30);
while(pas>0) {
if(rez+pas<=n && v[rez+pas]<=val) {
rez+=pas;
val-=v[rez];
}
pas/=2;
}
return rez;
}
int main() {
FILE *fin, *fout;
int m, i, x, a, b;
fin=fopen("aib.in","r");
fout=fopen("aib.out","w");
fscanf(fin, "%d%d",&n,&m);
for(i=1;i<=n;i++) {
fscanf(fin, "%d",&x);
update(i,x);
}
for(i=1;i<=m;i++) {
fscanf(fin, "%d",&x);
if(x==0) {
fscanf(fin, "%d%d",&a,&b);
update(a,b);
}
else if(x==1) {
fscanf(fin, "%d%d",&a,&b);
fprintf(fout, "%d\n",query1(b)-query1(a-1));
}
else {
fscanf(fin, "%d",&a);
fprintf(fout, "%d\n",query2(a));
}
}
fclose( fin );
fclose( fout );
return 0;
}