2018 Hunan province E

  • 动态开点
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> piir;
typedef long long ll;
const int maxn = 1e6+5;
const int INF = 0x3f3f3f3f;

int sum1[maxn],ls1[maxn],rs1[maxn],cnt1,rt1;
int sum2[maxn],ls2[maxn],rs2[maxn],cnt2,rt2;
void update1(int &o,int l,int r,int ql,int qr){
    if(!o) o=++cnt1;
    if(sum1[o] == r-l+1) return ;
    if(ql<=l && r<=qr){sum1[o]=r-l+1;return ;}
    int m = (l+r)>>1;
    if(ql <= m) update1(ls1[o],l,m,ql,qr);
    if(qr > m) update1(rs1[o],m+1,r,ql,qr);
    sum1[o] = sum1[ls1[o]] + sum1[rs1[o]];
}
void update2(int &o,int l,int r,int ql,int qr){
    if(!o) o=++cnt2;
    if(sum2[o] == r-l+1) return ;
    if(ql<=l && r<=qr) {sum2[o]=r-l+1;return ;}
    int m = (l+r)>>1;
    if(ql<=m) update2(ls2[o],l,m,ql,qr);
    if(qr>m) update2(rs2[o],m+1,r,ql,qr);
    sum2[o] = sum2[ls2[o]] + sum2[rs2[o]];
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    int n,m,q,op,a,b;
    while(~scanf("%d%d%d",&n,&m,&q)){
        cnt1=cnt2=rt1=rt2;
        while(q--){
            ll ans = 0;
            scanf("%d%d%d",&op,&a,&b);
            if(op==1) update1(rt1,1,n,a,b);
            else update2(rt2,1,m,a,b);

            if(sum1[1] && sum2[1]) ans =1ll * (n-sum1[1])*(m-sum2[1]) +1;
            else if(sum1[1]) ans = 1ll * (n-sum1[1]) * m + sum1[1];
            else ans = 1ll * n *(m-sum2[1]) + sum2[1];
            printf("%lld\n",ans);
        }

        for(int i=1;i<=cnt1;i++) sum1[i]=ls1[i]=rs1[i]=0;
        for(int i=1;i<=cnt2;i++) sum2[i]=ls2[i]=rs2[i]=0;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值