刚开始脑海中想的代码以为set可以过,然后打了过了样例交上去最慢1.83s以为改改就能过(虽然WA完了),然后改着改着就变成了暴力分了
set的每个节点是维护一个等差数列
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#define int long long
#define its set <node>::iterator
using namespace std;
int n,m,q;
struct node{
mutable int l,r,delta,st;
node (int ll=0,int rr=0,int ss=0,int dd=0) {l=ll,r=rr,delta=dd,st=ss;}
bool operator <(const node &b)
const{
return l<b.l;
}
};
set <node> s[300300],looker;
int getans(int y)
{
its _3mlooker=looker.end();
int ba=1;
its it=looker.lower_bound(node(y));
int l,r,st,delta;
if(it->l==y&&it!=looker.end()) ; else --it;
_3mlooker=++it; --it;
l=it->l,r=it->r,st=it->st,delta=it->delta;
int ans1=0;
if(r-l>=1)
{
looker.erase(it);
if(y!=l) looker.insert(node(l,y-1,st,delta));
ans1=st+(y-l)*delta;
if(y!=r)_3mlooker=looker.insert(node(y,r-1,st+(y-l+1)*delta,delta)).first,_3mlooker++,ba=1;
}
else
{
looker.erase(it);
ans1=st;
}
it=_3mlooker;
for(;ba&&it!=looker.end();it++)
it->l--,it->r--;
looker.insert(node(n,n,ans1,ans1));
return ans1;
}
int getans(int x,int y)
{
its _3mlooker=s[x].end();
its _looker=looker.end();
int ba=1,bb=1;
its it=s[x].lower_bound(node(y));
if(it->l==y&&it!=s[x].end()) ; else --it;
_3mlooker=++it; --it;
int l,r,st,delta;
l=it->l,r=it->r,st=it->st,delta=it->delta;
int ans1,ans2;
if(r-l>=1)
{
s[x].erase(it);
if(l!=y) s[x].insert(node(l,y-1,st,delta));
ans1=st+(y-l)*delta;
if(y!=r) _3mlooker=s[x].insert(node(y,r-1,st+(y-l+1)*delta,delta)).first,_3mlooker++,ba=1;
}
else
{
s[x].erase(it);
ans1=st;
}
it=looker.lower_bound(node(x));
if(it->l==x&&it!=looker.end()) ; else --it;
_looker=++it; --it;
l=it->l,r=it->r,st=it->st,delta=it->delta;
if(r-l>=1)
{
looker.erase(it);
if(x!=l) looker.insert(node(l,x-1,st,delta));
ans2=st+(x-l)*delta;
if(x!=r)_looker=looker.insert(node(x,r-1,st+(x-l+1)*delta,delta)).first,_looker++,bb=1;
}
else
{
looker.erase(it);
ans2=st;
}
it=_3mlooker;
for(;ba&&it!=s[x].end();it++)
it->l--,it->r--;
it=_looker;
for(;bb&it!=looker.end();it++)
it->l--,it->r--;
looker.insert(node(n,n,ans1,ans1));
s[x].insert(node(m-1,m-1,ans2,ans2));
// for(its it=s[x].begin();it!=s[x].end();it++) cout<<"("<<it->l<<", "<<it->r<<", "<<it->st<<") ";
// cout<<endl;
return ans1;
}
signed main()
{
freopen("3m.txt","r",stdin);
freopen("3m.out","w",stdout);
ios::sync_with_stdio(false);
register int i,j;
cin>>n>>m>>q;
int x,y;
for(i=1;i<=n;i++)
{
s[i].insert(node(1,m-1,(i-1)*m+1,1));
}
looker.insert(node(1,n,m,m));
for(i=1;i<=q;i++)
{
cin>>x>>y;
if(y!=m) cout<<getans(x,y)<<endl;
else cout<<getans(x)<<endl;
}
return 0;
}