# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
27371 | kdh9949 | Ruka (COI15_ruka) | C++14 | 3 ms | 3204 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
int n, q, l, tx[2], dx[100010][2], off;
const int B = 50000010;
struct BIT{
map<int, int> dat;
void upd(int x, int v){ for(x += B; x <= 2 * B; x += x & -x) dat[x] += v; }
int get(int x){ int ret = 0; for(x += B; x; x -= x & -x) ret += dat[x]; return ret; }
} U[2], D[2];
void ap(int t){
int nx = tx[t] + dx[l][t];
int s = min(tx[t], nx), e = max(tx[t], nx);
D[t].upd(s + off, -1); D[t].upd(e + off, 1);
U[t].upd(s, 1); U[t].upd(e, -1);
tx[t] += dx[l++][t];
}
void dui(int t){
tx[t] -= dx[--l][t];
int nx = tx[t] + dx[l][t];
int s = min(tx[t], nx), e = max(tx[t], nx);
U[t].upd(s, -1); U[t].upd(e, 1);
D[t].upd(s + off, 1); D[t].upd(e + off, -1);
}
void upd(int t, int v){
dx[t][l] += v;
off -= v;
}
int get(int t){
return U[t].get(0) + D[t].get(off);
}
int main(){
scanf("%d", &n);
tx[0] = tx[1] = 1;
for(int i = 1; i <= n; i++){
scanf("%d%d", dx[i], dx[i] + 1);
for(int t = 0; t < 2; t++){
int nx = tx[t] + dx[t][i];
D[t].upd(min(tx[t], nx), 1);
D[t].upd(max(tx[t], nx), -1);
tx[t] = nx;
}
}
l = 1;
tx[0] = tx[1] = 1;
scanf("%d", &q);
for(char t; q--; ){
scanf(" %c", &t);
if(t == 'F' && l < n){ ap(0); ap(1); }
else if(t == 'B' && l > 1){ dui(0); dui(1); }
else if(t == 'C'){
int x[2]; scanf("%d%d", x, x + 1);
upd(0, x[0]); upd(1, x[1]);
}
else{
printf("%d\n", get(0) + get(1));
}
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |