#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define X first
#define Y second
using namespace std;
typedef long long ll;
typedef pair < int, int > pii;
const int OFF = (1 << 19);
const int INF = 0x3f3f3f3f;
const int N = 3e5 + 500;
const int LOG = 20;
pii T[2 * OFF][2];
int n, q;
inline pii mrg(pii A, pii B){
return {max(A.X, B.X), min(A.Y, B.Y)};
}
void update(int i, int j, pii nw){
T[i + OFF][j] = nw;
for(i = (i + OFF) / 2 ; i ; i /= 2)
T[i][j] = mrg(T[2 * i][j], T[2 * i + 1][j]);
}
int q_gr, q_x, q_j;
int desnoo(int i, int a, int b){
//printf("i = %d a = %d b = %d q_gr = %d q_x = %d q_j = %d\n", i, a, b, q_gr, q_x, q_j);
if(b < q_gr || (T[i][q_j].X <= q_x && q_x <= T[i][q_j].Y))
return -1;
if(a == b) return a;
int L = desnoo(2 * i, a, (a + b) / 2);
if(L != -1)
return L;
return desnoo(2 * i + 1, (a + b) / 2 + 1, b);
}
inline int desno(int gdje, int kol, int j){
q_gr = gdje; q_x = kol; q_j = j;
return desnoo(1, 0, OFF - 1);
}
int par[N][2][LOG], LL[N], RR[N], L[N][2], R[N][2];
ll cst[N][2][LOG];
int vis[N][2];
inline int get_pos(int x){
if(x == 2 * n) return n;
return x % n;
}
int main(){
for(int i = 0;i < 2 * OFF;i++)
T[i][0] = {-INF, INF}, T[i][1] = {-INF, INF};
scanf("%d%d", &n, &q); n--;
for(int i = 0;i < n;i++){
scanf("%d%d", LL + i, RR + i); RR[i]--;
L[i][0] = LL[i] - i, R[i][0] = RR[i] - i;
L[n - i - 1][1] = LL[i] - (n - i - 1);
R[n - i - 1][1] = RR[i] - (n - i - 1);
}
for(int k = 0;k < 2;k++){
for(int i = 0;i < n;i++){
update(i, k, {L[i][k], R[i][k]});
vis[i][k] = L[i][k]; vis[i + n][k] = R[i][k];
}
update(n, k, {INF, -INF});
for(int i = 0;i < 2 * n;i++){
par[i][k][0] = desno(i % n, vis[i][k], k);
if(par[i][k][0] == n){
par[i][k][0] += n;
}
else if(vis[i][k] > R[par[i][k][0]][k]){
cst[i][k][0] = vis[i][k] - R[par[i][k][0] % n][k];
par[i][k][0] += n;
}
//printf("%d --> %d\n", i, par[i][k][0]);
}
//printf("tu sam\n");
par[2 * n][k][0] = 2 * n;
for(int j = 1;j < LOG;j++){
par[2 * n][k][j] = 2 * n;
for(int i = 0;i < 2 * n;i++){
par[i][k][j] = par[par[i][k][j - 1]][k][j - 1];
cst[i][k][j] = cst[i][k][j - 1] + cst[par[i][k][j - 1]][k][j - 1];
}
}
//printf("gotov precompute\n");
}
for(;q--;){
int ty; scanf("%d", &ty);
if(ty == 1) return 0;
int st, en, v_st, v_en;
scanf("%d%d%d%d", &st, &v_st, &en, &v_en); st--; en--;
int k = (st > en);
if(k){
st = n - st; en = n - en;
}
v_st -= st; v_en -= en;
//printf("st time = %d en time = %d\n", v_st, v_en);
int cur = desno(st, v_st, k);
//printf("vis %d\n", R[cur][k]);
//printf("cur = %d\n", cur);
if(cur >= en){
printf("%lld\n", max((ll)v_st - v_en, 0LL));
continue;
}
ll ans = 0;
if(v_st > R[cur][k]){
ans += v_st - R[cur][k];
cur += n;
}
for(int i = LOG - 1;i >= 0;i--){
if(get_pos(par[cur][k][i]) < en){
ans += cst[cur][k][i];
cur = par[cur][k][i];
}
}
//printf("cur = %d\n", cur);
//printf("ans: %lld\n", ans);
//printf("vis : %d krj : %d\n", vis[cur][k], v_en);
ans += max((ll)vis[cur][k] - v_en, 0LL);
printf("%lld\n", ans);
}
}
Compilation message
timeleap.cpp: In function 'int main()':
timeleap.cpp:62:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", &n, &q); n--;
~~~~~^~~~~~~~~~~~~~~~
timeleap.cpp:64:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d", LL + i, RR + i); RR[i]--;
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
timeleap.cpp:98:16: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
int ty; scanf("%d", &ty);
~~~~~^~~~~~~~~~~
timeleap.cpp:101:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d%d", &st, &v_st, &en, &v_en); st--; en--;
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
10 ms |
16768 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
479 ms |
343904 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
10 ms |
16768 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |