#pragma GCC optimize("O3")
#include <cstdlib>
#include <iostream>
typedef struct Node
{
int key;
struct Node *left, *right;
} Node;
int g_NumOf1s;
int g_arr[100010];
Node* CreateNode(int key)
{
Node* newNode = new Node;
newNode->key = key;
newNode->left = newNode->right = 0;
return newNode;
}
Node* Insert(Node* root, int key)
{
if(!root)
return CreateNode(key);
if(key < root->key)
root->left = Insert(root->left, key);
else if(key > root->key)
root->right = Insert(root->right, key);
return root;
}
Node* FindMin(Node* root)
{
while(root->left)
root = root->left;
return root;
}
Node* FindMax(Node* root)
{
while (root->right)
root = root->right;
return root;
}
Node* DeleteNode(Node* root, int key)
{
if(!root)
return root;
if(key < root->key)
root->left = DeleteNode(root->left, key);
else if(key > root->key)
root->right = DeleteNode(root->right, key);
else
{
if(!root->left)
{
Node* temp = root->right;
delete root;
return temp;
}
else if(!root->right)
{
Node* temp = root->left;
delete root;
return temp;
}
Node* temp = FindMin(root->right);
root->key = temp->key;
root->right = DeleteNode(root->right, temp->key);
}
return root;
}
Node* AddToList(Node* root, int toAdd)
{
++g_NumOf1s;
return Insert(root, toAdd);
}
Node* DeleteFromList(Node* root, int toDelete)
{
--g_NumOf1s;
return DeleteNode(root, toDelete);
}
int FindMinThick(Node* root, int N)
{
if(g_NumOf1s > 0)
return std::min(FindMin(root)->key - 1, N - FindMax(root)->key);
else
return N + 1;
}
void FreeTree(Node* root)
{
if(root)
{
FreeTree(root->left);
FreeTree(root->right);
delete root;
}
}
void RunD()
{
g_NumOf1s = 0;
int sumOfArr = 0;
int N, NQ, queryType, s, i, v, minThick;
Node* listOf1 = 0;
std::cin >> N >> NQ;
for(int idx = 0; idx < N; ++idx)
{
std::cin >> g_arr[idx];
sumOfArr += g_arr[idx];
if(g_arr[idx] == 1)
listOf1 = AddToList(listOf1, idx);
}
while(NQ--)
{
std::cin >> queryType;
if(queryType == 1)
{
std::cin >> s;
if(s > sumOfArr)
std::cout << "NO\n";
else
{
minThick = FindMinThick(listOf1, N);
if(s % 2 != sumOfArr % 2 && s > sumOfArr - 1 - 2 * minThick)
std::cout << "NO\n";
else
std::cout << "YES\n";
}
}
if(queryType == 2)
{
std::cin >> i >> v;
if(g_arr[i] != v)
{
sumOfArr += v - g_arr[i];
g_arr[i] = v;
if(v == 1)
listOf1 = AddToList(listOf1, i);
else // if(v == 2)
listOf1 = DeleteFromList(listOf1, i);
}
}
}
FreeTree(listOf1);
}
int main()
{
std::ios::sync_with_stdio(0);
std::cin.tie(0);
std::cout.tie(0);
int tc;
std::cin >> tc;
while(tc--)
RunD();
return 0;
}
set이라는걸 배워보십쇼 아이디어는 맞아요
C++ STL인가요
네 - dc App