Submission #69838269
Source Code Expand
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
const int maxn = 1e6+5;
class SegmentTree
{
public:
long long a[4 * maxn], add[4 * maxn];
inline void push_up(int rt) //向上更新
{
a[rt] = (a[rt * 2] + a[rt * 2 + 1]);
}
void build(int l, int r, int rt) //从l到r建立线段树
{
add[rt]=-1;
if (l == r)
{
a[rt]=1;
return;
}
int mid = (l + r) / 2;
build(l, mid, rt * 2);
build(mid + 1, r, rt * 2 + 1);
push_up(rt);
}
inline void push_down(int rt, int l,int r) //向下更新
{
if (add[rt] != -1)
{
add[rt * 2] = add[rt];
add[rt * 2 + 1] = add[rt];
int mid=l+r>>1;
a[rt * 2] = add[rt] ;
a[rt * 2 + 1] = add[rt] ;
add[rt] = -1;
}
}
void updata1(int x, int y, int l, int r, int rt) //线段树区间为从l到r,把区间x到y每个数+k
{
if (x <= l && y >= r)
{
a[rt] =0;
add[rt]=0;
return;
}
push_down(rt, l,r);
int mid = (l + r) / 2;
if (x <= mid)
updata1(x, y, l, mid, rt * 2);
if (y > mid)
updata1(x, y, mid + 1, r, rt * 2 + 1);
push_up(rt);
}
void updata2(int x, long long k, int l, int r, int rt) //线段树区间为从l到r,把区间x到y每个数+k
{
if (l==r)
{
a[rt] += k;
return;
}
push_down(rt, l,r);
int mid = (l + r) / 2;
if (x <= mid)
updata2(x, k, l, mid, rt * 2);
else
updata2(x, k, mid + 1, r, rt * 2 + 1);
push_up(rt);
}
long long query(int x, int y, int l, int r, int rt) //线段树区间为从l到r,询问区间x到y的和
{
if (x <= l && y >= r)
return a[rt];
push_down(rt, l, r);
int mid = (l + r) / 2;
long long ans = 0;
if (x <= mid)
ans += query(x, y, l, mid, rt * 2);
if (y > mid)
ans += query(x, y, mid + 1, r, rt * 2 + 1);
return ans;
}
}st;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n,q;
cin>>n>>q;
st.build(1,n,1);
while (q--)
{
int x,y;
cin>>x>>y;
int now=st.query(1,x,1,n,1);
cout<<now<<'\n';
st.updata1(1,x,1,n,1);
st.updata2(y,now,1,n,1);
}
}
Submission Info
| Submission Time |
|
| Task |
C - Upgrade Required |
| User |
Alliy666 |
| Language |
C++ 23 (gcc 12.2) |
| Score |
300 |
| Code Size |
2696 Byte |
| Status |
AC |
| Exec Time |
194 ms |
| Memory |
36408 KiB |
Compile Error
Main.cpp: In member function ‘void SegmentTree::push_down(int, int, int)’:
Main.cpp:34:22: warning: suggest parentheses around ‘+’ inside ‘>>’ [-Wparentheses]
34 | int mid=l+r>>1;
| ~^~
Main.cpp:34:17: warning: unused variable ‘mid’ [-Wunused-variable]
34 | int mid=l+r>>1;
| ^~~
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
300 / 300 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
sample_01.txt |
| All |
hand_01.txt, hand_02.txt, hand_03.txt, sample_01.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt |
| Case Name |
Status |
Exec Time |
Memory |
| hand_01.txt |
AC |
89 ms |
36216 KiB |
| hand_02.txt |
AC |
89 ms |
36144 KiB |
| hand_03.txt |
AC |
94 ms |
36280 KiB |
| sample_01.txt |
AC |
1 ms |
3408 KiB |
| test_01.txt |
AC |
1 ms |
3504 KiB |
| test_02.txt |
AC |
192 ms |
36184 KiB |
| test_03.txt |
AC |
193 ms |
36248 KiB |
| test_04.txt |
AC |
194 ms |
36404 KiB |
| test_05.txt |
AC |
84 ms |
36180 KiB |
| test_06.txt |
AC |
84 ms |
36268 KiB |
| test_07.txt |
AC |
89 ms |
36256 KiB |
| test_08.txt |
AC |
91 ms |
36212 KiB |
| test_09.txt |
AC |
99 ms |
36212 KiB |
| test_10.txt |
AC |
42 ms |
3540 KiB |
| test_11.txt |
AC |
42 ms |
3616 KiB |
| test_12.txt |
AC |
42 ms |
3476 KiB |
| test_13.txt |
AC |
42 ms |
3416 KiB |
| test_14.txt |
AC |
165 ms |
36344 KiB |
| test_15.txt |
AC |
130 ms |
36408 KiB |
| test_16.txt |
AC |
191 ms |
36184 KiB |
| test_17.txt |
AC |
161 ms |
36252 KiB |
| test_18.txt |
AC |
130 ms |
36264 KiB |
| test_19.txt |
AC |
187 ms |
36348 KiB |
| test_20.txt |
AC |
99 ms |
36284 KiB |
| test_21.txt |
AC |
99 ms |
36284 KiB |
| test_22.txt |
AC |
103 ms |
36288 KiB |