我的一些尝试:
fread
+快输(fwrite
不会用)求大佬帮忙卡常......
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
char ch=nc();
int sum=0;
while(!(ch>='0'&&ch<='9'))ch=nc();
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
return sum;
}
inline void printi(int x){
if(x/10){
printi(x/10);
}
putchar(x%10+'0');
}
struct Node{
int l,r;
mutable int val;
Node(int L,int R,int V):l(L),r(R),val(V){}
Node(int L):l(L){}
bool operator<(const Node &o)const{
return l<o.l;
}
};
set<Node>s;
int n,m;
#define Sit set<Node>::iterator
Sit split(int pos){
Sit it=s.lower_bound(Node(pos));
if(it!=s.end()&&it->l==pos){
return it;
}
it--;
int L=it->l,R=it->r,V=it->val;
s.erase(it);
s.insert(Node(L,pos-1,V));
return s.insert(Node(pos,R,V)).first;
}
inline void assign(int l,int r,int k){
Sit itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(Node(l,r,k));
}
inline int query(int x){
int ans=0,now=0;
for(Sit it=s.begin();it!=s.end();it++){
if(it->val==0&&it->r<=n){
if(now==0)ans=it->l;
now+=it->r-it->l+1;
if(now>=x)return ans;
}
else now=0;
}
return 0;
}
int main(void){
n=read(),m=read();
s.insert(Node(1,n,0));
while(m--){
int opt,x,l,r;
opt=read();
if(opt==1){
x=read();
int qwq=query(x);
printi(qwq);
putchar('\n');
if(qwq!=0)assign(qwq,qwq+x-1,1);
}
else{
l=read(),r=read();
assign(l,l+r-1,0);
}
}
return 0;
}