Pagini recente » Cod sursa (job #1272891) | Cod sursa (job #127930) | Cod sursa (job #2016749) | Monitorul de evaluare | Cod sursa (job #2738863)
#include <stdio.h>
using namespace std;
const int MAXPN = 131072;
int n, m, pn;
int st, dr;
int a[2*MAXPN+2];
int query(int i, int start, int end) {
if(st <= start && dr >= end)
return a[i];
int um = (start+end)/2;
if(dr <= um)
return query(2*i, start, um);
if(st > um)
return query(2*i+1, um+1, end);
return query(2*i, start, um) + query(2*i+1, um+1, end);
}
int sumTo(int i) {
st = 1;
dr = i;
return query(1, 1, pn);
}
int main()
{
FILE* fin = fopen("aib.in", "r");
FILE* fout = fopen("aib.out", "w");
fscanf(fin, "%d %d", &n, &m);
int aux = n;
pn = 1;
while(aux > 0) {
aux >>= 1;
pn <<= 1;
}
if(pn == 2*n)
pn = n;
for(int i=pn; i<pn+n; i++)
fscanf(fin, "%d", &a[i]);
for(int i=pn-1; i>0; i--)
a[i] = a[2*i]+a[2*i+1];
int x, xa, xb;
for(int i=1; i<=m; i++) {
fscanf(fin, "%d %d", &x, &xa);
if(x < 2)
fscanf(fin, "%d", &xb);
if(x == 0)
for(xa = pn+xa-1; xa > 0; xa /= 2)
a[xa] += xb;
if(x == 1) {
st = xa; dr = xb;
fprintf(fout, "%d\n", query(1, 1, pn));
}
if(x == 2) {
int l=1, r=n, mid, val;
while(l < r) {
mid = (l+r)/2;
val = sumTo(mid);
if(val < xa)
l = mid+1;
else
r = mid;
}
fprintf(fout, "%d\n", sumTo(l) == xa ? l : -1);
}
}
return 0;
}