Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int L = 2e9;
- const int N = 1e5 + 1;
- const int logN = 17;
- struct Node{
- int all, blue;
- };
- Node tree[1 << (logN + 1)];
- bool lazy[1 << (logN + 1)];
- int ques[N + 1];
- vector <int> pst;
- int len[N + 1];
- int l, sz;
- Node Combine(Node L, Node R){
- Node node;
- node.all = L.all + R.all;
- node.blue = L.blue + R.blue;
- return node;
- }
- void Build(int idx, int l, int r){
- if(l == r){
- tree[idx].all = tree[idx].blue = len[l - 1];
- return ;
- }
- int mid = (l + r) / 2;
- Build(2 * idx, l, mid);
- Build(2 * idx + 1, mid + 1, r);
- tree[idx] = Combine(tree[2 * idx], tree[2 * idx + 1]);
- }
- void Flip(int idx, int l, int r){
- if(l != r){
- lazy[2 * idx] = !lazy[2 * idx];
- lazy[2 * idx + 1] = !lazy[2 * idx + 1];
- }
- tree[idx].blue = tree[idx].all - tree[idx].blue;
- lazy[idx] = false;
- }
- void Update(int idx, int l, int r, int s, int e){
- if(lazy[idx]) Flip(idx, l, r);
- if(r < s or e < l) return;
- if(s <= l and r <= e){
- Flip(idx, l, r);
- return;
- }
- int mid = (l + r) / 2;
- Update(2 * idx, l, mid, s, e);
- Update(2 * idx + 1, mid + 1, r, s, e);
- tree[idx] = Combine(tree[2 * idx], tree[2 * idx + 1]);
- }
- int Index(int x, int l = 0, int r = sz - 1){
- while(l <= r){
- int mid = (l + r) / 2;
- if(pst[mid] == x) return mid;
- else if(pst[mid] < x) l = mid + 1;
- else r = mid - 1;
- }
- }
- int main(){
- int n;
- scanf("%d %d", &l, &n);
- pst.push_back(1);
- for(int i=1;i<=n;i++){
- scanf("%d", &ques[i]);
- ques[i] ++;
- pst.push_back(ques[i]);
- }
- sort(pst.begin(), pst.end());
- pst.resize( unique(pst.begin(), pst.end()) - pst.begin() );
- sz = pst.size();
- for(int i=0;i<=sz-2;i++){
- len[i] = pst[i + 1] - pst[i];
- }
- len[sz - 1] = l - pst[sz - 1] + 1;
- Build(1, 1, sz);
- for(int i=1;i<=n;i++){
- int idx = Index(ques[i]) + 1;
- Update(1, 1, sz, idx, sz);
- printf("%d\n", tree[1].blue);
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment