Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- const int MAXN = 262144;
- // stores binary tree in [1..2*MAXN-1], the leaves are [MAXN..2*MAXN-1]
- // assumes MAXN is a power of 2. functions act on [x..y]
- const int INF = 0x3f3f3f3f;
- int a[2*MAXN], b[2*MAXN];
- inline int update(int y, int v, int i=1, int l=0, int r=MAXN-1) {
- if (y<l) return a[i];
- if (l==r) return a[i] += v;
- if (r <= y) {
- b[i] += v;
- return a[i]+b[i];
- }
- int m = (l+r)/2;
- if (b[i]) {
- b[2*i] += b[i];
- b[2*i+1] += b[i];
- b[i] = 0;
- }
- if(y < m) update(y,v,2*i,l,m);
- else {
- b[2*i] += v;
- update(y,v,2*i+1,m+1,r);
- }
- a[i] = min(a[2*i]+b[2*i], a[2*i+1]+b[2*i+1]);
- }
- int main() {
- int n; scanf("%d", &n);
- memset(a, INF, sizeof a); memset(b, 0, sizeof b);
- for (int i=0; i < n; i++) a[MAXN+i] = i-n;
- for (int i=MAXN-1; i >= 1; i--) a[i] = min(a[2*i], a[2*i+1]);
- int z[n+1];
- for (int i=1; i <= n; i++) {
- scanf("%d", z+i);
- update(z[i]-1, 1);
- }
- printf("%s\n", a[1] < 0 ? "NIE" : "TAK");
- int m; scanf("%d", &m);
- while(m--) {
- int j, w; scanf("%d %d", &j, &w);
- update(z[j]-1, -1);
- update(w-1, 1);
- z[j] = w;
- printf("%s\n", a[1] < 0 ? "NIE" : "TAK");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement