description
小m的實驗室有很多電源插排。這些插排的編號從1到n,由左向右排成一排。每天早晨,這些插排都是沒有被使用
的。每當乙個學生來到實驗室,他就將自己的筆記本電源插到某乙個未被使用的插排上。實驗室的同學們都很奇怪
,他們完成這個過程是這樣的:首先,他們找到還沒有被使用的插排的最長區間。如果有多個區間長度相同,他們
就選擇最靠右的那個。然後將自己的電源插到該區間的中間。如果區間長度是偶數,他們同樣選擇靠右的那個。當
乙個同學離開實驗室時,他會將自己的電源拔出來。資料保證每乙個同學來到實驗室時,至少有乙個空的插排。現
在給你實驗室同學的來到和離開事件,和一些詢問。對於每乙個詢問,你需要計算在區間[l,r]已經有多少個插排
被使用了。
input
第一行是兩個整數n和q,表示插排數量和詢問數量。
接下來q行,每一行以乙個整數k開頭,如果k為0,
接下來就是兩個整數l和r(1≤l≤r≤n),表示乙個詢問。否則表示編號為k的學生到來或離開(k≤109)。
k的奇數次出現表示到來,偶數次出現表示離開。每個學生的編號都是唯一的。
n ≤ 10^9, q ≤ 10^5
output
對於每乙個詢問,輸出乙個整數,表示詢問區間內有多少個插排已經被使用了。
sample input
7 10
1 2 3
0 1 2
0 4 7
0 2 5
20 0 6 6
99 0 4 6
sample output
1 2
2 1
3 hint
source
動態開點線段樹 模板題 注意bzoj交的時候我的**裡unordered_map不可用 換成map即可
#include
#include
#include
#include
#include
using
namespace
std;
inline
char gc()
return *s++;
}inline
int read()
while(isdigit(ch)) x=x*10+ch-'0',ch=gc();
return x*f;
}const
int n=1e5+100;
unordered_map
mm,id;int num,n,q,root;
struct node}tree[n*40];
inline
void update(int x,int l,int r)
inline
void init(int &x,int l,int r)
inline
void insert1(int &x,int l,int r,int p,int v)
if (p<=mid) insert1(tree[x].left,l,mid,p,v);
else insert1(tree[x].right,mid+1,r,p,v);update(x,l,r);
}inline
int query(int &x,int l,int r,int len)
inline
int qr(int &x,int l,int r,int l1,int r1)
inline
void print(int x,int l,int r)
int main()++mm[k];if(mm[k]&1)else insert1(root,1,n,id[k],1);
}return
0;}
BZOJ5334 Tjoi2018 數學計算
time limit 10 sec memory limit 256 mb submit 234 solved 155 小豆現在有乙個數x,初始值為1.小豆有q次操作,操作有兩種型別 1 m x x m 輸出 x mod 2 pos x x 第pos次操作所乘的數 保證第pos次操作一定為型別1,對...
Bzoj 3175 Tjoi2013 攻擊裝置
給定乙個01矩陣,其中你可以在0的位置放置攻擊裝置。每乙個攻擊裝置 x,y 都可以按照 日 字攻擊其周圍的 8個位置 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 求在裝置互不攻擊的情況下,最多可以放置多少個裝置。第一...
BZOJ3175 Tjoi2013 攻擊裝置
bzoj3175 tjoi2013 攻擊裝置 給定乙個01矩陣,其中你可以在0的位置放置攻擊裝置。每乙個攻擊裝置 x,y 都可以按照 日 字攻擊其周圍的 8個位置 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 求在裝置...