Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/[email protected] | Cod sursa (job #856640)
Cod sursa(job #856640)
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
const int Nmax = 15001;
ifstream f("datorii.in");
ofstream g("datorii.out");
int V[Nmax], N, M, Q, rad, lo, hi, poz, val;
vector<int> st, dr, arb;
void update() {
int i;
V[poz] -= val;
for(i=1; i<=Q; ++i)
if(st[i] <= poz && poz <= dr[i]) {
arb[i] -= val;
break;
}
}
int query() {
int i, sum, left, right;
sum = 0;
left = 1<<30;
right = -1;
for(i=1; i<=Q; ++i) {
if(lo <= st[i] && dr[i] <= hi) {
left = min(left, st[i]);
right = max(right, dr[i]);
sum += arb[i];
}
if(dr[i] > hi)
break;
}
for(i=lo; i<left; ++i)
sum += V[i];
for(i=right+1; i<=hi; ++i)
sum += V[i];
return sum;
}
void build() {
int i, j;
for(rad=1; rad*rad<=N; ++rad);
--rad;
Q = N/rad + 1;
st.resize(Q+1);
dr.resize(Q+1);
arb.resize(Q+1);
for(i=1; i<=Q; ++i) {
arb[i] = 0;
st[i] = rad*(i-1)+1;
dr[i] = rad*i;
for(j=st[i]; j<=dr[i]; ++j)
arb[i] += V[j];
}
}
int main() {
int i, op;
f>>N>>M;
for(i=1; i<=N; ++i)
f>>V[i];
build();
while(M--) {
f>>op;
if(op == 1) {
f>>lo>>hi;
g<<query()<<"\n";
continue;
}
if(op == 0) {
f>>poz>>val;
update();
continue;
}
}
f.close();
g.close();
return 0;
}