AC on #12,#13 10pts。动态开点线段树。已经调了进两天了,求大佬调
#include<bits/stdc++.h>
#define int long long
using namespace std;
void timings(string info=""){if(info=="")cerr<<"timings = "<<clock()<<endl;else cerr<<"timings = "<<clock()<<" with info "<<info<<endl;}
#define debug(x) {cerr<<"timings "<<clock()<<", ["<<#x<<" == "<<x<<"] on line "<<__LINE__<<" in "<<__func__<<"()"<<endl;}
int tree[20000000],id[20000000],lc[20000000],rc[20000000],now[600005];
int cnt=0;
int n,m,q;
void update(int p,int l,int r,int x,int k,int ori){
if(l==r){
id[p]=k;
tree[p]=(int)(k!=0);
return;
}
int mid=(l+r)>>1;
tree[p]=0;
if(x<=mid){
if(!lc[p]){
lc[p]=++cnt;
if(l==mid&&l<=((ori==n+1)?n:m-1)){
id[lc[p]]=(ori-1)*n+l;
tree[lc[p]]=1;
if(ori==n+1){
id[lc[p]]=l*n;
}
}else if(l<=((ori==n+1)?n:m-1)){
tree[lc[p]]=(mid-l+1);
}
}
update(lc[p],l,mid,x,k,ori);
}else{
if(!rc[p]){
rc[p]=++cnt;
if(r==mid+1&&r<=((ori==n+1)?n:m-1)){
id[rc[p]]=(ori-1)*n+r;
tree[rc[p]]=1;
if(ori==n+1){
id[rc[p]]=r*n;
}
}else if(r<=((ori==n+1)?n:m-1)){
tree[rc[p]]=(r-mid);
}
}
update(rc[p],mid+1,r,x,k,ori);
}
if(lc[p]){
tree[p]+=tree[lc[p]];
}else{
tree[p]+=(mid-l+1);
}
if(rc[p]){
tree[p]+=tree[rc[p]];
}else{
tree[p]+=(r-mid);
}
}
pair<int,int> query(int p,int l,int r,int k,int ori){
if(l==r){
return make_pair(id[p],l);
}
int mid=(l+r)>>1;
if(!lc[p]){
lc[p]=++cnt;
if(l==mid&&l<=((ori==n+1)?n:m-1)){
id[lc[p]]=(ori-1)*n+l;
tree[lc[p]]=1;
if(ori==n+1){
id[lc[p]]=l*n;
}
}else if(l<=((ori==n+1)?n:m-1)){
tree[lc[p]]=(mid-l+1);
}
}
if(!rc[p]){
rc[p]=++cnt;
if(r==mid+1&&r<=((ori==n+1)?n:m-1)){
id[rc[p]]=(ori-1)*n+r;
tree[rc[p]]=1;
if(ori==n+1){
id[rc[p]]=r*n;
}
}else if(r<=((ori==n+1)?n:m-1)){
tree[rc[p]]=(r-mid);
}
}
if(k<=tree[lc[p]]){
return query(lc[p],l,mid,k,ori);
}else{
return query(rc[p],mid+1,r,k-tree[lc[p]],ori);
}
}
signed main(){
//ios::sync_with_stdio(0);
//cin.tie(0);cout.tie(0);
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
now[i]=m-1;
}
now[n+1]=n;
cnt=n+1;
for(int i=1;i<=q;i++){
int x,y;
cin>>x>>y;
pair<int,int> tmp;
if(y!=m){
tmp=query(x,1,m-1+q,y,x);
cout<<tmp.first<<"\n";
update(x,1,m-1+q,tmp.second,0,x);
update(n+1,1,n+q,++now[n+1],tmp.first,n+1);
tmp=query(n+1,1,n+q,x,n+1);
update(n+1,1,n+q,tmp.second,0,n+1);
update(x,1,m-1+q,++now[x],tmp.first,x);
}else{
tmp=query(n+1,1,n+q,x,n+1);
cout<<tmp.first<<"\n";
update(n+1,1,n+q,tmp.second,0,n+1);
update(n+1,1,n+q,++now[n+1],tmp.first,n+1);
}
}
return 0;
}