刚刚 Div.2 的 T4 怎么写啊,我看好像很多大佬都是一开始 T 了很多后面就 A 了,而本蒟蒻一直 TLE,不知道还能怎么优化。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define FRR(file) freopen(file,"r",stdin)
#define FRW(file) freopen(file,"w",stdout)
#define TIMESTAMP cerr<<fixed<<setprecision(3)<<clock()*1.0/CLOCKS_PER_SEC<<"s"<<endl;
#define _rep(i,a,b) for (int i=(a);i<=(b);++i)
#define _reps(i,a,b,c) for (int i=(a);i<=(b);c)
#define _rrep(i,a,b) for (int i=(a);i>=(b);--i)
#define _rreps(i,a,b,c) for (int i=(a);i>=(b);c)
#define _iter(i,a) for (auto i=a.begin();i!=a.end();++i)
#define _graph(i,u) for (int i=h[u];~i;i=ne[i])
#define rint register int
#define LL long long
typedef pair<int,int> pii;
namespace IO {
inline void read(int &a) {
int sym=1,num=0;
char c=getchar();
while (c<'0' || c>'9') {
if (c=='-') {
sym=-1;
}
c=getchar();
}
while (c>='0' && c<='9') {
num=num*10+c-'0';
c=getchar();
}
a=sym*num;
}
inline void write(int a) {
if (a<0) {
putchar('-');
a*=-1;
}
if (a>=10) {
write(a/10);
}
putchar(a%10+'0');
}
}
using IO::read;
using IO::write;
const int N=300005;
int T,n,m;
vector<int> nums;
struct node {
int a,b;
} arr[N];
struct Seg {
int l,r;
int num,sum;
} tr[N<<2];
Seg tmp[N];
inline void pushup(int u) {
if (tr[u<<1].sum==tr[u<<1|1].sum) {
tr[u].sum=tr[u<<1].sum;
tr[u].num=max(tr[u<<1].num,tr[u<<1|1].num);
} else if (tr[u<<1].sum>tr[u<<1|1].sum) {
tr[u].sum=tr[u<<1].sum;
tr[u].num=tr[u<<1].num;
} else {
tr[u].sum=tr[u<<1|1].sum;
tr[u].num=tr[u<<1|1].num;
}
}
inline void build(int u,int l,int r) {
tr[u]={l,r,l,0};
if (l==r) return;
int mid=l+r>>1;
build(u<<1,l,mid); build(u<<1|1,mid+1,r);
pushup(u);
}
inline void modify(int u,int p,int k) {
if (tr[u].l==p && tr[u].r==p) tr[u].sum+=k;
else {
int mid=tr[u].l+tr[u].r>>1;
if (p<=mid) modify(u<<1,p,k);
else modify(u<<1|1,p,k);
pushup(u);
}
}
inline Seg query(int u,int l,int r) {
if (tr[u].l>=l && tr[u].r<=r) return tr[u];
Seg ans,L={0,0,0,0},R={0,0,0,0};
int mid=tr[u].l+tr[u].r>>1;
if (l<=mid) L=query(u<<1,l,r);
if (r>mid) R=query(u<<1|1,l,r);
if (L.sum==R.sum) {
ans.sum=L.sum;
ans.num=max(L.num,R.num);
} else if (L.sum>R.sum) {
ans.sum=L.sum;
ans.num=L.num;
} else {
ans.sum=R.sum;
ans.num=R.num;
}
return ans;
}
signed main() {
read(T); read(n); read(m);
_rep(i,1,n) {
int a,b;
read(a); read(b);
arr[i]={a,b};
nums.emplace_back(b);
}
sort(nums.begin(),nums.end());
nums.erase(unique(nums.begin(),nums.end()),nums.end());
_rep(i,1,n) arr[i].b=lower_bound(nums.begin(),nums.end(),arr[i].b)-nums.begin()+1;
build(1,1,(int)nums.size());
_rep(i,1,n) modify(1,arr[i].b,arr[i].a);
int debug=0;
if (T==8 || T==9) {
int i=n;
while (i) {
tmp[i]=query(1,1,(int)nums.size());
modify(1,arr[i].b,-arr[i].a);
--i;
}
++i;
while (i<=n) modify(1,arr[i].b,arr[i].a),++i;
}
while (m--) {
int op;
read(op);
if (op==1) {
int x,y;
read(x); read(y);
arr[x].a+=y;
modify(1,arr[x].b,y);
} else {
int q;
read(q);
int i=n;
int sum=0;
// unordered_map<int,int> hs;
while (i) {
Seg t;
if (T!=8 && T!=9) t=query(1,1,(int)nums.size());
else t=tmp[i];
sum^=(nums[t.num-1]*arr[i].a);
if (sum==q) break;
if (T!=8 && T!=9) modify(1,arr[i].b,-arr[i].a);
// hs[arr[i].b]+=arr[i].a;
--i;
}
// printf("%lld\n",n-i+1);
write(n-i+1); putchar(10);
debug+=n-i+1;
++i;
if (T!=8 && T!=9) while (i<=n) modify(1,arr[i].b,arr[i].a),++i;
// _iter(it,hs) modify(1,it->first,it->second);
}
}
return 0;
}