RT
按照老师的思路写的
但最后一个点不是WA就是MLE
#include <bits/stdc++.h>
using namespace std;
#define ll long
const int N=3e5+5;
int n,m,q;
struct Segment{
int lc,rc;
int sum;
ll num;
int lazy;
#define lc(x) t[x].lc
#define rc(x) t[x].rc
#define sum(x) t[x].sum
#define num(x) t[x].num
#define lazy(x) t[x].lazy
}t[17100000];
int tot;
int build() {
t[++tot]={0,0,0,0,0};
return tot;
}
void pushdown(int id,int l,int r) {
if(!lc(id)) lc(id)=build();
if(!rc(id)) rc(id)=build();
if(lazy(id)!=0) {
int mid=l+r>>1;
sum(lc(id))+=lazy(id)*(mid-l+1);
lazy(lc(id))+=lazy(id);
sum(rc(id))+=lazy(id)*(r-mid);
lazy(rc(id))+=lazy(id);
lazy(id)=0;
}
}
void modify(int id,int L,int R,int l,int r,int val) {
if(L>=l && R<=r) {
sum(id)+=val*(R-L+1);
lazy(id)+=val;
return ;
}
pushdown(id,L,R);
int mid=L+R>>1;
if(mid>=l) modify(lc(id),L,mid,l,r,val);
if(mid+1<=r) modify(rc(id),mid+1,R,l,r,val);
sum(id)=sum(lc(id))+sum(rc(id));
}
void add(int id,int L,int R,int pos,int val,ll num) {
if(L==R) {
sum(id)+=val;
num(id)=num;
return ;
}
pushdown(id,L,R);
int mid=L+R>>1;
if(mid>=pos) add(lc(id),L,mid,pos,val,num);
else add(rc(id),mid+1,R,pos,val,num);
sum(id)=sum(lc(id))+sum(rc(id));
}
int binary(int id,int L,int R,int k) {
if(L==R) return L;
pushdown(id,L,R);
int mid=L+R>>1;
if(sum(lc(id))>=k) return binary(lc(id),L,mid,k);
return binary(rc(id),mid+1,R,k-sum(lc(id)));
}
ll get(int id,int L,int R,int pos) {
if(L==R) return num(id);
pushdown(id,L,R);
int mid=L+R>>1;
if(mid>=pos) return get(lc(id),L,mid,pos);
return get(rc(id),mid+1,R,pos);
}
int rtn[N],lenn[N];
int rtm,lenm;
void init() {
for(int i=1;i<=n;i++) {
rtn[i]=build();
lenn[i]=m-1;
if(m>1) modify(rtn[i],1,m-1+q,1,m-1,1);
}
rtm=build();
lenm=n;
modify(rtm,1,n+q,1,n,1);
}
int main() {
scanf("%d%d%d",&n,&m,&q);
init();
for(int i=1;i<=q;i++) {
int x,y;
scanf("%d%d",&x,&y);
if(y<m) {
int pos=binary(rtn[x],1,m-1+q,y);
ll ans;
if(pos<=m-1) ans=(ll)m*(x-1)+pos;
else ans=get(rtn[x],1,m-1+q,pos);
add(rtn[x],1,m-1+q,pos,-1,0);
pos=binary(rtm,1,n+q,x);
if(pos<=n) add(rtn[x],1,m-1+q,++lenn[x],1,(ll)pos*m);
else add(rtn[x],1,m-1+q,++lenn[x],1,get(rtm,1,n+q,pos));
add(rtm,1,n+q,pos,-1,0);
add(rtm,1,n+q,++lenm,1,ans);
printf("%ld\n",ans);
}
else {
int pos=binary(rtm,1,n+q,x);
ll ans;
if(pos<=n) ans=(ll)pos*m;
else ans=get(rtm,1,n+q,pos);
add(rtm,1,n+q,pos,-1,0);
add(rtm,1,n+q,++lenm,1,ans);
printf("%ld\n",ans);
}
}
return 0;
}