Submission #43201

#TimeUsernameProblemLanguageResultExecution timeMemory
43201smu201111192즐거운 사진 수집 (JOI13_collecting)C++14
100 / 100
2215 ms44208 KiB
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = (1<<21);
int n,q;
int rtree[MAXN],ctree[MAXN];
long long rsum[MAXN],csum[MAXN];
void update(int node,int st,int ed,int pos,int *tree,long long *sum,int dep){
    if(pos > ed || pos < st)return;
    if(st == ed){
        tree[node] ^= 1;
        return;
    }
    if(tree[node] == 0 || tree[node] == (1LL <<(n-dep))) sum[dep]--;
    update(node*2,st,(st+ed)/2,pos,tree,sum,dep+1);
    update(node*2+1,(st+ed)/2+1,ed,pos,tree,sum,dep+1);
    tree[node] = tree[node * 2] + tree[node * 2 +1];
    if(tree[node] == 0 || tree[node] == (1LL <<(n-dep))) sum[dep]++;
    return;
}
int main(){
    ios::sync_with_stdio(false); cin.tie(0);
    cin >> n >> q;
    for(int i = 0; i <= n; i++){
        rsum[i] = csum[i] = (1LL << i);
    }
    for(int i = 1; i <= q; i++){
        int type; int line;
        cin >> type >> line;
        if(type == 0) update(1,1,(1<<n),line,rtree,rsum,0);
        else update(1,1,(1<<n),line,ctree,csum,0);
        long long ret = 0;
        long long last = 0;
        for(int j = 0; j <= n; j++){
            long long a = 1<<j;
            long long b = 1<<j;
            ret += a * b;
            ret -= 4 * last;
            last = rsum[j] * csum[j];
        }
        cout<<ret<<"\n";
    }
     return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...