Pagini recente » Cod sursa (job #934947) | Cod sursa (job #903021) | Cod sursa (job #870654) | Cod sursa (job #2178622) | Cod sursa (job #609662)
Cod sursa(job #609662)
#include <fstream>
#define NMAX 100001
#include <cstring>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,i,m,a,b,x,o,val;
int Arb[NMAX];
void update(int poz,int val) {
int p,k;
while (poz<=n) {
Arb[poz]+=val;p=1;k=0;
while ((poz&p)==0) {
k++;
p<<=1;
}
poz+=(1<<k);
}
}
int query(int poz) {
int p,k,val=0;
while (poz>0) {
val+=Arb[poz];p=1;k=0;
while ((poz&p)==0) {
k++;
p<<=1;
}
poz-=(1<<k);
}
return val;
}
int search(int val) {
int i,pas;
for (pas=1;pas<n;pas<<=1);
for (i=0;pas>0;pas>>=1) {
if (i+pas<=n) {
if (val>=Arb[i+pas]) {
val-=Arb[i+pas];i+=pas;
if (val==0) return i;
}
}
}
return -1;
}
int main() {
memset(Arb,0,sizeof(Arb));
f >> n >> m;
for (i=1;i<=n;i++) {
f >> x;
update(i,x);
}
for (i=1;i<=m;i++) {
f >> o;
if (o==0) {
f >> a >> b;
update(a,b);
}
if (o==1) {
f >> a >> b;
val=query(b)-query(a-1);
g << val << '\n';
}
if (o==2) {
f >> a;
val=search(a);
g << val << '\n';
}
}
f.close();g.close();
return 0;
}